相关疑难解决方法(0)

是什么让Lisp宏如此特别?

阅读Paul Graham关于编程语言的论文,人们会认为Lisp宏是唯一可行的方法.作为一个忙于开发人员,在其他平台上工作,我没有使用Lisp宏的特权.作为想要了解嗡嗡声的人,请解释是什么让这个功能如此强大.

还请将此与我从Python,Java,C#或C开发世界中理解的内容联系起来.

lisp macros homoiconicity

284
推荐指数
12
解决办法
6万
查看次数

在Lisp或Scheme中是否存在整个程序转换宏?

我已经看到一个答案:Lisp如何让你重新定义语言本身? Stack Overflow问题(由Noah Lavine回答):

宏并不是对语言的完全重新定义,至少据我所知(我实际上是一个Schemer;我可能是错的),因为有一个限制.宏只能占用代码的单个子树,并生成一个子树来替换它.因此,你不能编写整个程序转换宏,就像那样酷.

阅读本文之后,我很好奇是否在Lisp或Scheme(或其他语言)中存在"整个程序转换宏".

如果不是那么为什么?

  • 它没用,从不需要?
  • 通过其他方式可以实现同样的目的吗?
  • 即使在Lisp中也无法实现它?
  • 有可能,但没有尝试或实施过吗?

更新

一种用例,例如

在stumpwm代码中,这里的一些函数都在不同的lisp源文件中使用了一个动态/全局defvar变量*screen-list*,它在primitives.lisp中定义,但在screen.lisp,user.lisp,window.lisp中使用.(这里每个文件都有与一个方面或对象相关的函数,类,变量)

现在我想在闭包下定义这些函数,其中 *screen-list*变量可以通过let表单获得,它不应该是动态/全局变量,但是不要将这些函数移动到一个地方(因为我不希望这些函数丢失来自相关文件的位置)这样只有这些函数才能访问这个变量.

以上例如同样适用于标签和flet,因此我们可以进一步使它成为只需要变量,功能将可用于需要它的人.

注意一种方法可能是实现并使用一些宏defun_with_context进行defun,其中第一个参数是上下文,其中let,flet变量definend.但除此之外,Vatine和Gareth Rees回答说,它可以通过读者宏来实现.

lisp macros scheme transformation

6
推荐指数
2
解决办法
780
查看次数

标签 统计

lisp ×2

macros ×2

homoiconicity ×1

scheme ×1

transformation ×1