如何在Racket中将define-syntax与syntax-case分开

3
考虑以下两个Racket代码片段:
;version A
(define-syntax (b stx) 
  (syntax-case stx () [(X u) #'(display  (syntax->datum #'(X u v)))]))
(b 1)

并且

;version B
(define-for-syntax (g stx) 
  (syntax-case stx () [(X u) #'(display  (syntax->datum #'(X u v)))]))
(define-syntax (b s) (g s))
(b 1)

实验结果显示,这两个程序都返回了 (b 1 v)。问题是:“版本B”是否是有效的Racket?如果是,它是否完全等同于“版本A”?
1个回答

4

是的,这两种方法都可以,而且和你注意到的一样,它们的作用完全相同。


谢谢!对于初学者来说,Racket宏的语法很令人困惑。我猜(define-syntax ...)(b 1)转换成类似的东西。 - amkhlv
谢谢!对于初学者来说,Racket宏的语法很令人困惑。我猜(define-syntax (b s) (g s))(b 1)转换成类似于(g (datum->syntax #'(b 1)))的东西,然后再转换成(display'(b 1 v))并进行评估——是这样吗?我的困惑在于,我认为s会变成1,下意识地假设(define-syntax ...)的行为方式会像(define ...)一样。 - amkhlv
2
如果你还没有看过的话,Greg Hendershott的《宏的恐惧》可能会有所帮助。 - Asumu Takikawa
谢谢,Asumu Takikawa。我开始阅读Greg Hendershott的书了。非常有帮助。 - amkhlv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接