[racket] how to use syntax-case
Did you have a look at the excellent `math/array' library? Its arrays
are immutable by default.
Vincent
At Fri, 7 Feb 2014 08:22:22 +0900,
亀田馬志 wrote:
>
> Hello. I have a problem around how to use syntax-case.
>
> Here's a situation.
> I'm using SRFI-25, the array library. It is useful; however, it doesn't
> provide something like "copy-array". I would not like to use something
> "destructive", therefor I would like to make a copy of an array I defined.
>
> I noticed I could make a copy if I use "array" function provided there.
> Here is its format:
>
> (array shape obj ...)
>
> I mean, in order to make a copy of an array, the idea must be
>
> (array (array-shape the-original) obj ...)
>
> ;however, I wondered how I should express "obj ..." part. The supplement of
> SRFI25, or arlib.scm, provides array->list function, so I noticed I've got
> to use a macro like this in the Common Lisp style.
>
> (defmacro copy-array (arr)
> `(array (array-shape arr) ,@(array->list arr)))
>
> At first, I checked Racket reference and I tried (require
> compatibility/defmacro).
>
> > (require srfi/25 racket/include compatibility/defmacro)
> > (include "arlib.scm")
> > (define-macro (copy-array arr)
> `(array (array-shape arr) ,@(array->list arr)))
> > (define a (array (shape 0 3 0 3) 1 2 3 4 5 6 7 8 9))
> > (define b (copy-array a))
> . . array->list: undefined;
> cannot reference an identifier before its definition
> phase: 1
> explanation: cannot access the run-time definition
>
> Strangely, even though I'd included "arlib.scm", the interpreter said
> array->list was undefined.
> So it might be the time(actually the first time to me) to use syntax-case.
> Through some basic tutorials around syntax-case, the syntax-case macro
> equivalent to the macro written in Common Lisp style stated above must be
> something like this, I believe:
>
> (define-syntax copy-array
> (lambda (stx)
> (syntax-case stx ()
> ((_ arr)
> #`(array (array-shape arr) #,@(array->list (syntax->datum
> #'arr)))))))
>
> I tried:
>
> > (define b (copy-array a))
> . . array->list: undefined;
> cannot reference an identifier before its definition
> phase: 1
> explanation: cannot access the run-time definition
>
> array->list is "undefined" again.
> What happens in the syntax-case here?
>
> Thanx.