[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 マクロ版