I wanted a 'define' that stores in a hash the arguments and the function
definition so I don't keep forgetting argument order and having to go to
the file and check. So with my very little knowledge of macros, I wrote
this:
#lang racket
(define global (make-hash))
(define-syntax (assign stx)
(syntax-case stx []
([_ (f xs ...) b ...]
#'[begin
(hash-set! global 'f (list 'λ '(xs ...) 'b ...))
(define (f xs ...) b ...)])
([_ a b]
#'[begin
(hash-set! global 'a b)
(define a b)])))
Surprisingly it works:
assign.rkt> (assign (sum a b) (+ a b))
assign.rkt> global
'#hash((sum . (λ (a b) (+ a b))))
But what surprises me the most is that it only works at the top level:
assign.rkt>
assign.rkt> (assign foo 3)
assign.rkt> (assign (bar x) (assign foo 7) (* x foo))
assign.rkt> (bar 1)
7
assign.rkt> global
'#hash((bar . (λ (x) (assign foo 7) (* x foo))) (foo . 3))
I suspected I would have had some trouble with local definitions colliding
with the global hash, but luckily it isn't happening. Why is that?
Another question: my macro doesn't work with (f . xs) notation. Of course,
I could add a [_ f . xs] syntax-case. But I would also have to add a [_ f a
... . xs]. Plus keywords. Is there a way not to have to describe every
possible situation?
--
You received this message because you are subscribed to the Google Groups
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/racket-users/CAN4YmREN1q%2BDTF1UbTHc8LmN3gfnea5HAZCQfc%3DRPyLVHX2yVg%40mail.gmail.com.