【问题标题】:how to separate define-syntax from syntax-case in Racket如何在 Racket 中将定义语法与语法案例分开
【发布时间】:2013-06-06 15:49:46
【问题描述】:

考虑以下两段球拍代码:

;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”是有效的球拍吗?如果是,是否完全等同于“版本A”?

【问题讨论】:

    标签: macros racket


    【解决方案1】:

    是的,正如您所注意到的,这两者都很好,并且做的事情完全相同。

    【讨论】:

    • 谢谢! Racket 宏的语法对于初学者来说是令人困惑的。我猜(define-syntax ...)(b 1) 转换成类似
    • 谢谢! Racket 宏的语法对于初学者来说是令人困惑的。我猜(define-syntax (b s) (g s))(b 1) 转换为(g (datum->syntax #'(b 1))) 之类的东西,然后再转换为(display '(b 1 v)) 并进行评估——对吗?我的困惑是,我认为s 会变成1,下意识地假设(define-syntax ...) 的行为会像(define ...)
    • 如果您还没有看过,Greg Hendershott 的Fear of Macros 可能会有所帮助。
    • 谢谢你,泷川明。我开始阅读格雷格·亨德肖特。很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多