【问题标题】:Syntax-Rule syntax语法规则语法
【发布时间】:2013-09-20 00:25:37
【问题描述】:

我一直在研究定义语法规则的语法,但我仍然卡住了。

我想用这个签名定义一个规则:(define-syntax-rule (for {val in lst} return res)。

基本上它只是应用给定 val 和 lst 的 map。但我在语法上苦苦挣扎。这是我到目前为止想出的.. …… (语法规则() ((对于 lst 中的 val) (地图(val lst)))) ...

输入会是这样的:

(for {val in '(0 1 2 3 4)} 返回 (- val 1) )

并输出 (-1 0 1 2 3),就好像在列表中调用了 map。

【问题讨论】:

  • 您不能使用define-syntax-rule,因为定义中有文字(即inreturn)。 @GoZoner 的回答(如果你在 (val in list) 周围添加括号)给你你想要的。 (在 Racket 中,花括号与常规括号相同。)
  • 顺便说一下,R​​acket 带有for/list,它与您尝试定义的功能相同。 (for/list ([val '(0 1 2 3 4)]) (- val 1)) => '(-1 0 1 2 3)

标签: scheme racket


【解决方案1】:

这样就搞定了:

(define-syntax for
  (syntax-rules (in return)
    ((for val in list return exp)
     (map (lambda (val) exp) list))))

> (for x in '(0 1 2 3) return (- x 1))
(-1 0 1 2)

基本上,这正是您所描述的。您需要将 inreturn 声明为文字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2012-01-26
    • 2017-08-18
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多