[scheme] srfi 53
srfi 53 の便利関数をいろいろ作った
https://github.com/niitsuma/Racket-miniKanren/blob/recursive/srfi-53.scm
364行より下が自分の書いた追加関数
non-syntax-macro-conpose-after
srfi 53のマクロは他の普通のマクロと混在して使えない。
普通のマクロと同時に使う苦肉の策として、srfi-53のマクロの処理が終わった後で、普通のマクロに適用するようにした
使用例
(define-syntax reverse-order-quote (syntax-rules () ((_ e) (reverse-order-quote e ())) ((_ (e . rest) r) (reverse-order-quote rest (e . r))) ((_ () r) 'r))) (define-syntax-computation syntax-cdr (computation-rules () ( ( _ (h . t)) (syntax-return t)) )) (non-syntax-macro-conpose-after (syntax-cdr (2 3 -) ) reverse-order-quote ) > '(- 3)
srfi-53で書いたsyntax-cdr の後で、
reverse-order-quote という普通のマクロを適用している
syntax-gensym
srfi 53マクロ上で使えるgensym
使用例
(define-syntax-computation testing (computation-rules ( ) (( _ v ) (syntax-do (var <- (syntax-gensym)) (syntax-return var) )))) (syntax-inspect (testing foo)) > 'g12345
中身は
(define-macro (syntax-gensym k) (let ((var (gensym))) `(syntax-return ,k ,var) ))
syntax-lset-adjoin
srfi-1の lset-adjoin マクロ版