在Racket中,您可以通过以下方式定义语法:
(define-syntax foo
(syntax-rules ()
((_ "abc") 'xyz)))
运行
(foo "abc")
它返回'xyz。使用define:
实现此目的(define (foo x)
(match x ["abc" 'xyz]))
这次,
(foo "abc")
仍然会返回'xyz。使用这些不同形式有什么区别?
答案 0 :(得分:3)
define-syntax
定义了一个宏。宏在编译时处理,并生成要编译的新代码,函数在运行时执行。因此,宏无法访问运行时变量,也不会评估其参数。要查看差异,请尝试:
(define param "abc")
(foo param)
用两种方式定义foo
。这将适用于该功能,但不适用于宏。
答案 1 :(得分:1)
试试这个:
(define abc "abc")
(foo abc)
您会看到两个版本之间的结果非常不同。