define-syntax与定义函数

时间:2013-09-12 23:59:28

标签: function scheme racket

在Racket中,您可以通过以下方式定义语法:

(define-syntax foo
  (syntax-rules ()
    ((_ "abc") 'xyz)))

运行

(foo "abc")

它返回'xyz。使用define:

实现此目的
(define (foo x)
  (match x ["abc" 'xyz]))

这次,

(foo "abc")

仍然会返回'xyz。使用这些不同形式有什么区别?

2 个答案:

答案 0 :(得分:3)

define-syntax定义了一个宏。宏在编译时处理,并生成要编译的新代码,函数在运行时执行。因此,宏无法访问运行时变量,也不会评估其参数。要查看差异,请尝试:

(define param "abc")
(foo param)

用两种方式定义foo。这将适用于该功能,但不适用于宏。

答案 1 :(得分:1)

试试这个:

(define abc "abc")
(foo abc)

您会看到两个版本之间的结果非常不同。