Scheme 为什么此宏在Racket中不工作
我尝试使用一个宏,在未给出“else”语句时应用“when”函数,否则使用“if”: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) ) 然而,这
(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
的部分是语法对象,其中包含有关其来源的信息。语法是否是`
,,
和,@
,如何将其创建为函数(而不是宏)?@msoif
永远不可能成为一种渴望的语言中的函数,但可以使用函数来创建语法,而不是模式匹配语法规则。我添加了一个示例。我的意思是拥有一个myif“函数”或“过程”(而不是宏或语法):(定义(myif条件体(body2#f))……)。是否可能?@mso如果myif
作为一个过程实施,它将评估后续的
和备选方案
,而不考虑谓词的结果
。因此(定义(测试x)(myif)(如何将其创建为函数(而不是宏)?@msoif
永远不可能成为一种渴望的语言中的函数,但可以使用函数来创建语法,而不是模式匹配语法规则。我添加了一个示例。我的意思是拥有一个myif“函数”或“过程”(而不是宏或语法):(定义(myif条件体(body2#f))……)。有可能吗?@mso如果myif
作为一个程序实施,它将评估结果
和备选方案
,而不考虑谓词
的结果。因此(定义(测试x)(myif(