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宏中的任意计算的主要内容,如果未能解决你的问题,请参考以下文章

使用自动填充和清除匹配相邻列 - 宏中的错误提示

如何计算Scheme中数字的位数总和?

如何在 OpenOffice Calc 宏中获得合并的单元格行/列跨度

在Excel宏中引用行号的公式

Python科学计算——任意波形拟合

计算机大师Dijkstra谈Haskell和Java