我想要定义新的语法。如果我在没有库的情况下定义它
(define-syntax sample1
(syntax-rules (:times)
[(_ n :times body ...)
(list n (sample1 body ...))]
[(c body ...)
'(body ...)]))它按预期工作,但如果我把它放在图书馆里:
(library (alib)
(export sample2)
(import
(rnrs))
(define-syntax sample2
(syntax-rules (:times)
[(_ n :times body ...)
(list n (sample2 body ...))]
[(c body ...)
'(body ...)]))):times文本停止工作。如果我将:times替换为已经存在的宏(如=>或else )中的文本表示,则可以工作。
以下是Chez中的完整示例:
(define-syntax sample1
(syntax-rules (:times)
[(_ n :times body ...)
(list n (sample1 body ...))]
[(c body ...)
'(body ...)]))
(sample1 a b c d)
;; => (a b c d)
(sample1 10 :times a b c d)
;; => (10 (a b c d))
(library (alib)
(export sample2)
(import
(rnrs))
(define-syntax sample2
(syntax-rules (:times)
[(_ n :times body ...)
(list n (sample2 body ...))]
[(c body ...)
'(body ...)])))
(import (alib))
(sample2 10 :times a b c d)
;; => (10 :times a b c d)发布于 2022-05-20 14:50:20
您可以使用挡泥板表达式作为辅助关键字的替代。
(library (alib)
(export sample2)
(import
(chezscheme)) ;; <= required for syntax-rules fenders
(define-syntax sample2
(syntax-rules ()
[(_ n :times body ...)
(eq? (datum :times) ':times) ;; <= fender
(list n (sample2 body ...))]
[(c body ...)
'(body ...)])))
(import (alib))
(sample2 10 :times a b c d) ;; => (10 (a b c d))定义一个keyword?宏以使护舷更干净。
(library (meta)
(export keyword?)
(import (chezscheme))
(define-syntax keyword?
(syntax-rules ()
[(_ x) (eq? (datum x) 'x)])))
(library (alib)
(export sample2)
(import (meta) (chezscheme))
(define-syntax sample2
(syntax-rules ()
[(_ n :times body ...)
(keyword? :times)
(list n (sample2 body ...))]
[(c body ...)
'(body ...)])))
(import (alib))
(sample2 10 :times a b c d) ;; => (10 (a b c d))https://stackoverflow.com/questions/71734227
复制相似问题