Scheme 语法规则语法

Scheme 语法规则语法,scheme,racket,Scheme,Racket,我一直在查看定义语法规则的语法,但是我仍然被卡住了 我想用这个签名定义一个规则:(define syntax rule(对于{val in lst}return res) 基本上,它只是在给定val和lst的情况下应用map。但我正在努力解决语法问题。这就是我到目前为止想到的。。 .... (语法规则() ((对于lst中的val) (地图(val lst))) 输入类似于: (用于{val in'(01 2 3 4)} 返回(-val 1) ) 和输出(-1 0 1 2 3),就好像在列表中

我一直在查看定义语法规则的语法,但是我仍然被卡住了

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

基本上,它只是在给定val和lst的情况下应用map。但我正在努力解决语法问题。这就是我到目前为止想到的。。 .... (语法规则() ((对于lst中的val) (地图(val lst)))

输入类似于:

(用于{val in'(01 2 3 4)} 返回(-val 1) )

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

这就完成了:

(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)
本质上,这正是您所描述的。您需要在中声明
,并将
返回
声明为文字。

这就完成了:

(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)

本质上,这正是您所描述的。您需要将
中的
返回声明为文字。

您不能使用
定义语法规则
,因为您在定义中有文字(即
中的
返回
)。@GoZoner的答案(如果您在
(列表中的val)周围添加paren)
)给你你想要的。(在Racket中,花括号和普通括号一样。)顺便说一下,Racket附带的功能与你试图定义的功能相同。
(for/list([val'(0 1 2 3 4)](-val 1))
=>
(-1 0 1 2 3)
您不能使用
定义语法规则
,因为您在定义中有文字(即
中的
返回
)。@GoZoner的回答(如果您在
(列表中的val)
周围添加括号)会提供您想要的内容。(在Racket中,花括号与常规括号相同。)顺便说一句,球拍的功能与您试图定义的功能相同。
(for/list([val'(0 1 2 3 4)](-val 1))
=>
”(-1 0 1 2 3)