On Thu, Nov 3, 2011 at 3:02 PM, Mirko Vukovic <mirko.vuko...@gmail.com>wrote:

> 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.
>
> Consider the following function:
>
> (defun foo (x y)
>   (let ((z (grid:map-n-grids  :combination-function (lambda (y)
>                               y)
>                   :sources `((,y nil)))))
>     (gsll:make-interpolation gsll:+linear-interpolation+
>                  x z)))
>
> If I call it twice with vectors of different size on the second call
>
> (let ((x #m(1d0 2d0 3d0))
>       (y #m(1d0 1d0 1d0))
>       (u #m(1d0 2d0 3d0 4d0))
>       (v #m(1d0 1d0 1d0 1d0)))
>   (foo x y)
>   (foo u v))
>
> I get an error on the second call
>
> Invalid argument; data must match size of interpolation object in interp.c
> at line 76
>    [Condition of type GSLL:INVALID-ARGUMENT]
>
> It seems that `z' still somehow lives with incorrect dimensions between
> the calls.
>
> In actual use, I call foo from repl.  So, before calling it, I force a
> recompile, so that it works for a new vector.
>
> Is there a more elegant workaround for this problem?
>
> Thanks,
>
> Mirko
>
I figured out the cause of the error.  In the function
(defun foo (x y)
  (let ((z (grid:map-n-grids  :combination-function (lambda (y)
                              y)
                  :sources `((,y nil)))))
    (gsll:make-interpolation gsll:+linear-interpolation+
                 x z)))

I was defining sources using `((,y nil)) to save myself typing.  But this
expands into a (cons ... ) list.
If I do it explicitly (list (list y nil)), the problem goes away.

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.

Mirko
_______________________________________________
GSLL-devel mailing list
GSLL-devel@common-lisp.net
http://lists.common-lisp.net/cgi-bin/mailman/listinfo/gsll-devel

Reply via email to