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
On Thu, Nov 3, 2011 at 3:02 PM, Mirko Vukovic mirko.vukovic@gmail.comwrote:
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