【问题标题】:define-syntax vs. defining functions定义语法与定义函数
【发布时间】:2013-09-17 12:56:39
【问题描述】:

在 Racket 中,你可以这样定义语法:

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

通过运行

(foo "abc")

它返回'xyz。使用define实现这个:

(define (foo x)
  (match x ["abc" 'xyz]))

这一次,

(foo "abc")

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

【问题讨论】:

  • 你认为每一个被计算的时间是什么时间?你知道compile时间和run时间的区别吗?

标签: function scheme racket


【解决方案1】:

试试这个:

(define abc "abc")
(foo abc)

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

【讨论】:

    【解决方案2】:

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

    (define param "abc")
    (foo param)
    

    用你定义foo的两种方式。这将适用于函数,但不适用于宏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2020-09-02
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      相关资源
      最近更新 更多