Scheme宏中的任意计算
Posted
技术标签:
【中文标题】Scheme宏中的任意计算【英文标题】:Arbitrary computation in Scheme macro 【发布时间】:2010-11-08 10:36:23 【问题描述】:Scheme 宏,至少是语法案例种类,据说允许对要转换的代码进行任意计算。但是(无论是在一般情况下还是在我目前正在研究的特定情况下),这都需要根据递归函数来指定计算。当我尝试各种变体时,我会得到例如
main.scm:32:71: compile: unbound identifier in module (in the transformer environment, which does not include the run-time definition) in: expand-vars
(如果重要的话,实现是 Racket。)
结果似乎是在宏处理之后才能定义命名函数。
我想我可以使用 Y 组合器,但我认为值得先问一下是否有更好的方法?
【问题讨论】:
【参考方案1】:是的,您使用 Racket 的事实很重要——在 Racket 中,有一种叫做“相分离”的东西,这意味着语法级别不能使用运行时函数。例如,这个:
#lang racket
(define (bleh) #'123)
(define-syntax (foo stx)
(bleh))
(foo)
由于bleh
在运行时绑定,因此无法使用,无法用于语法。相反,它应该是
(define-for-syntax (bleh) #'123)
或
(begin-for-syntax (define (bleh) #'123))
或作为内部定义移至宏主体,或移至其自己的模块并需要使用(require (for-syntax "bleh.rkt"))
。
【讨论】:
以上是关于Scheme宏中的任意计算的主要内容,如果未能解决你的问题,请参考以下文章