Scheme 为什么此宏在Racket中不工作

Scheme 为什么此宏在Racket中不工作,scheme,racket,Scheme,Racket,我尝试使用一个宏,在未给出“else”语句时应用“when”函数,否则使用“if”: (define-syntax-rule (myif condition body (body2 #f)) (if (not body2) (when condition body) (if condition body body2))) (define x 15) (myif (> x 10) (println x) ) 然而,这

我尝试使用一个宏,在未给出“else”语句时应用“when”函数,否则使用“if”:

(define-syntax-rule (myif condition body (body2 #f))
  (if (not body2)
      (when condition body)
      (if condition
          body
          body2)))

(define  x 15)
(myif (> x 10) (println x) ) 
然而,这是行不通的。错误是:

myif: use does not match pattern: 
   (myif condition body (body2 #f)) in: (myif (> x 10) (println x))

define syntax rules
不像带有可选参数的过程那样接受参数

(定义语法规则(myif条件体(body2#f))
...)
同:

(定义语法myif
(语法规则()
[(myif条件体(body2#f))…])
一个有效的用法是
(myif谓词结果(可选#f))
,它变成:

(如果不是(备选方案#f))
(当断言结果时)
(如果谓词结果(备选方案#f)))
似乎您正试图让代码在编译时运行,而不是扩展的一部分,因为这将在谓词之前计算替代项。这不适用于
语法规则
,但是,您可以使用两种不使用简化语法的模式:

(定义语法myif
(语法规则()
[(uu-谓词结果替代方案)(如果谓词结果替代方案)]
[(uu)谓词结果(当谓词结果)])
编辑

因此,用一个函数来实现宏也可以做到同样的事情。这是一个我想不出的没有刺激,没有特殊功能的实现。注:对于这样的宏,我只是一个初学者

(定义语法(myif stx)
(let((lst(语法->列表stx)))
(如果(=(长度lst)3)
#`(当#,@(cdr lst))
#`(如果#,@(cdr lst())))

请注意,
lst
的部分是语法对象,其中包含有关其来源的信息。是
`
的语法变量,@

定义语法规则
不像带有可选参数的过程那样接受参数

(定义语法规则(myif条件体(body2#f))
...)
同:

(定义语法myif
(语法规则()
[(myif条件体(body2#f))…])
一个有效的用法是
(myif谓词结果(可选#f))
,它变成:

(如果不是(备选方案#f))
(当断言结果时)
(如果谓词结果(备选方案#f)))
似乎您正在尝试让代码应该在编译时运行,而不是扩展的一部分,因为这将在谓词之前计算替代项。这不适用于
语法规则
,但是您可以使用两种不使用简化语法的模式:

(定义语法myif
(语法规则()
[(uu-谓词结果替代方案)(如果谓词结果替代方案)]
[(uu)谓词结果(当谓词结果)])
编辑

因此,用一个函数来实现宏也可以做到同样的事情。这是一个我想不出的没有刺激,没有特殊功能的实现。注:对于这样的宏,我只是一个初学者

(定义语法(myif stx)
(let((lst(语法->列表stx)))
(如果(=(长度lst)3)
#`(当#,@(cdr lst))
#`(如果#,@(cdr lst())))

请注意,
lst
的部分是语法对象,其中包含有关其来源的信息。语法是否是
`
,@

如何将其创建为函数(而不是宏)?@mso
if
永远不可能成为一种渴望的语言中的函数,但可以使用函数来创建语法,而不是模式匹配语法规则。我添加了一个示例。我的意思是拥有一个myif“函数”或“过程”(而不是宏或语法):(定义(myif条件体(body2#f))……)。是否可能?@mso如果
myif
作为一个过程实施,它将评估
后续的
备选方案
,而不考虑
谓词的结果
。因此
(定义(测试x)(myif)(如何将其创建为函数(而不是宏)?@mso
if
永远不可能成为一种渴望的语言中的函数,但可以使用函数来创建语法,而不是模式匹配语法规则。我添加了一个示例。我的意思是拥有一个myif“函数”或“过程”(而不是宏或语法):(定义(myif条件体(body2#f))……)。有可能吗?@mso如果
myif
作为一个程序实施,它将评估
结果
备选方案
,而不考虑
谓词
的结果。因此
(定义(测试x)(myif(