<br><br><div class="gmail_quote">On Thu, Nov 3, 2011 at 3:02 PM, Mirko Vukovic <span dir="ltr"><<a href="mailto:mirko.vukovic@gmail.com">mirko.vukovic@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
The following is using a a few months old GSLL and SBCL -- I do not want to upgrade unless absolutely necessary at this moment, because I need to finish a project first.<br><br>Consider the following function:<br><br>(defun foo (x y)<br>

  (let ((z (grid:map-n-grids  :combination-function (lambda (y)<br>                              y)<br>                  :sources `((,y nil)))))<br>    (gsll:make-interpolation gsll:+linear-interpolation+<br>                 x z)))<br>

<br>If I call it twice with vectors of different size on the second call<br><br>(let ((x #m(1d0 2d0 3d0))<br>      (y #m(1d0 1d0 1d0))<br>      (u #m(1d0 2d0 3d0 4d0))<br>      (v #m(1d0 1d0 1d0 1d0)))<br>  (foo x y)<br>
  (foo u v))<br>
<br>I get an error on the second call<br><br>Invalid argument; data must match size of interpolation object in interp.c at line 76<br>   [Condition of type GSLL:INVALID-ARGUMENT]<br><br>It seems that `z' still somehow lives with incorrect dimensions between the calls.<br>

<br>In actual use, I call foo from repl.  So, before calling it, I force a recompile, so that it works for a new vector.<br><br>Is there a more elegant workaround for this problem?<br><br>Thanks,<br><br>Mirko<br>
</blockquote></div>I figured out the cause of the error.  In the function<br>(defun foo (x y)<br>
  (let ((z (grid:map-n-grids  :combination-function (lambda (y)<br>                              y)<br>                  :sources `((,y nil)))))<br>    (gsll:make-interpolation gsll:+linear-interpolation+<br>                 x z)))<br>
<br>I was defining sources using `((,y nil)) to save myself typing.  But this expands into a (cons ... ) list.  <br>If I do it explicitly (list (list y nil)), the problem goes away.  <br><br>The underlying reason is that `list' always creates a fresh list while `cons' does not.  Thus, lisp re-used the old cons while I really needed a new list.<br>
<br>Mirko<br>