Sujet : Re: CL vs scheme macros, namespaces.
De : No_spamming (at) *nospam* noWhere_7073.org (B. Pym)
Groupes : comp.lang.lispDate : 03. Jul 2024, 13:58:56
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <v63edt$2637i$1@dont-email.me>
User-Agent : XanaNews/1.18.1.6
To take a simple example:
(define-syntax -->
(syntax-rules ()
((_ . original)
(-->helper () original))))
(define-syntax -->helper
(syntax-rules ()
((_ pairs (x0 y0 . more))
(-->helper ((x0 y0) . pairs) more))
((_ pairs body)
(let pairs . body))))
(defmacro --> (&rest [var-val]*-body)
`(let ,(loop for (var val) on (butlast [var-val]*-body) by (function cddr)
collect (list var val))
,@(last [var-val]*-body)))
The helper macro isn't needed.
Scheme (Gauche and Racket):
The goal is a let-macro that doesn't need parentheses
around the bindings. Only one expression is allowed
after the bindings.
(define-syntax -->
(syntax-rules ()
[ (_ ((k v) ...) expr)
(let ((k v) ...) expr) ]
[ (_ ((k v) ...) a b . more)
(--> ((k v) ... (a b)) . more) ]
[ (_ a b c more ...)
(--> () a b c more ...) ]))
(--> a 2 m 44 z 88 (print (list a m z)))
===>
(2 44 88)
(--> a 2 m 44 z 88 )
===>
; stdin:10:0: -->: bad syntax
; in: (--> ((a 2) (m 44) (z 88)))