[Gsll-devel] About the naming convention in gsll
Mirko Vukovic
mirko.vukovic at gmail.com
Fri May 16 20:28:21 UTC 2008
On Fri, May 16, 2008 at 3:20 PM, Zach <elzacho at gmail.com> wrote:
> Mirko,
>
> I am in the same boat as you as I have rarely used GSLL for anything.
I hope to use it more for numerics and data analysis, within nlisp.
But I am (even after a few months) just starting with lisp, and my
synapses are still lacking.
>
> However, name conflicts in CL can be dealt with by the package system,
> right? As in,
>
> (defpackage :gsll-wrapper
> (:use :cl)
> (:export #:letm #:vector-double-float #:data
> ;; And the rest of the GSLL names you like
> )
> (:shadow #:solve-tridiagonal) ) ; shadow GSLL's function and replace it
>
> (in-package :gsll-wrapper)
>
> ;; Define your SOLVE-TRIDIAGONAL
> (defun solve-tridiagonal (args*)
> your definition ...
> (gsll:solve-tridiagonal ...)
> more stuff ... )
Your suggestion seems very sensible.
>
> Then, just use your custom wrapped version of GSLL instead.
>
> Perhaps I am wrong, but it seems that GSLL is shaping up to be a relatively
> low level binding to GSL. Luckily, the issue you raise is easily
> corrected. In my opinion, you are right that much work can be done in the
> direction of abstracting away the foreign feel of GSLL.
That seems correct. That is why I felt that the functions generated
by GSLL should correspond closely to GSLL names, since they are
essentially wrappers. One would hope that with time, there would be a
superset package with a more lispy interface.
One concern I have is that if we wrap a GSLL within a function, then
we may end up passing variables by value from the top level down,
which is inefficient. I *hope* that if the second level wrappers are
written as macros this dissapears.
For example I defined the following macro:
(defmacro solve-tridiag (d e f b)
`(letm ((d* (vector-double-float ,d))
(e* (vector-double-float ,e))
(f* (vector-double-float ,f))
(x* (vector-double-float (make-array (length ,d)
:element-type 'double-float
:initial-element 0d0)))
(b* (vector-double-float ,b)))
(solve-tridiagonal d* e* f* b* x*)
(data x*)))
I am not too strong with macros, but I am hoping that since the macro
is expanded at compile time, there is no passing by value of variables
d,e,f,b.
>
> Zach
>
I hope the GSLL's author, Liam, takes these comments in stride, since
he did awesome work, and what we are discussing here is the "dressing"
on an otherwise a very cool package.
Mirko
>>
>> I find the naming convention in gsll inconvenient. For example the
>> routine solve-tridiagonal is a wrapper for gsl_linalg_solve_tridiag.
>> To use it to solve a system defined by vectors d e f b, one needs to
>> use a letm block to this effect:
>>
>> (letm ((d* (vector-double-float d))
>> (e* (vector-double-float e))
>> (f* (vector-double-float f))
>> (x* (vector-double-float (make-array (length d) :element-type
>> 'double
>> :initial-element 0d0))
>> (b* (vector-double-float b)))
>> (solve-tridiagonal d* e* f* b* x*)
>> (data x*))
>>
>> Using the routine solve-tridiagonal is still not convenient, because
>> one still needs to convert the argument vectors via the
>> vector-double-float, obscuring the code. If I have multiple calls, I
>> will have to repeat these, or define my own interface function. And
>> here is the problem: *the very nice name solve-tridiagonal is taken*.
>> I could name it solve-tridiag, but sooner or later, I will make a
>> mistake and call the wrong function with the incorrect arguments.
>>
>> Ideally, once we have gsll, one would just need to do
>> (solve-tridiagonal d e f b). To accomplish that, gsll would need to
>> use the following convention:
>> - the c-code wrapper would be named the same as the c-code, except
>> with the underscores replaced with dashes. Thus we would have
>> (defmfun gsl-linalg-solve-tridiag (diag e f b x)
>> "gsl_linalg_solve_tridiag"
>> (((pointer diag) gsl-vector-c) ((pointer e) gsl-vector-c)
>> ((pointer f) gsl-vector-c) ((pointer b) gsl-vector-c)
>> ((pointer x) gsl-vector-c))
>> :invalidate (x)... etc)
>>
>> - Users/contributors can define interface routines that would link to
>> the gsll routine:
>> (defun solve-tridiag (d e f b)
>> (letm ((d* (vector-double-float d))
>> (e* (vector-double-float e))
>> (f* (vector-double-float f))
>> (x* (vector-double-float (make-array (length d) :element-type
>> 'double
>> :initial-element 0d0))
>> (b* (vector-double-float b)))
>> (solve-tridiagonal d* e* f* b* x*)
>> (data x*))
>>
>> (I have not tried it, but maybe macros should be better to remove the
>> pass-by-value cost of calling the routine).
>>
>> So, what am I missing?
>>
>> Thanks,
>>
>> Mirko
>> _______________________________________________
>> Gsll-devel mailing list
>> Gsll-devel at common-lisp.net
>> http://common-lisp.net/cgi-bin/mailman/listinfo/gsll-devel
>
>
More information about the gsll-devel
mailing list