考虑以下两个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”?
(define-syntax ...)
将(b 1)
转换成类似的东西。 - amkhlv(define-syntax (b s) (g s))
将(b 1)
转换成类似于(g (datum->syntax #'(b 1)))
的东西,然后再转换成(display'(b 1 v))
并进行评估——是这样吗?我的困惑在于,我认为s
会变成1
,下意识地假设(define-syntax ...)
的行为方式会像(define ...)
一样。 - amkhlv