【发布时间】:2011-06-13 02:44:44
【问题描述】:
我看过一个How does Lisp let you redefine the language itself?的回答 Stack Overflow 问题(由 Noah Lavine 回答):
宏并不是对语言的完全重新定义,至少据我所知(我实际上是一个计划者;我可能是错的),因为有一个限制。宏只能获取代码的单个子树,并生成单个子树来替换它。因此,你不能编写整个程序转换的宏,那样会很酷。
阅读本文后,我很好奇 Lisp 或 Scheme(或其他语言)中是否存在“整个程序转换宏”。
如果不是那为什么?
- 它没用,也从来不需要?
- 同样的事情可以通过其他方式实现吗?
- 即使在 Lisp 中也无法实现?
- 有可能,但从未尝试或实施过?
更新
一种用例 例如
在 stumpwm 代码中 这里有一些函数都在不同的 lisp 源文件中 使用在 primitives.lisp 中定义但在 screen.lisp、 中使用的动态/全局 defvar 变量 *screen-list* >user.lisp,window.lisp。 (这里每个文件都有与一个方面或对象相关的函数、类、变量)
现在我想在闭包下定义这些函数 *screen-list* 变量可以通过 let 形式获得,它不应该是 动态/全局变量,但没有将这些所有函数移入 一个地方(因为我不希望这些功能从它们的 相关文件) 这样这个变量就只能被这些函数访问。
上面例如同样适用于 label 和 flet,以便进一步可能 我们可以让它像只需要的变量,函数将可用, 给需要的人。
注意一种方法可能是 为 defun 实现并使用一些宏 defun_with_context ,其中第一个参数是 上下文 let, flet 变量定义。 但除此之外,它可以通过 reader-macro 实现 Vatine 和 Gareth Rees 回答了。
【问题讨论】:
标签: macros lisp scheme transformation