sam*_*est -7 lisp macros common-lisp
所以看了3个小时的youtube视频,并花了很长时间阅读Lisp,我还没有看到这些"魔术宏"允许人们编写DSL,甚至可以做一些简单的事情,比如4 + 5 没有把它嵌入到一些大括号中.
这里有一些讨论:常见的lisp:输入数学表达式有一种不太痛苦的方法吗?但语法看起来并不好看,仍需要一些封闭的绒毛来定义宏的开始和结束位置.
所以这是挑战,定义一个中缀宏,然后使用它而不必用某种附加语法将其括起来.即
Some macro definition here
1 + 2
Run Code Online (Sandbox Code Playgroud)
不
Some macro definition here
(my-macro 1 + 2)
Run Code Online (Sandbox Code Playgroud)
不
Some macro definition here
ugly-syntax 1 + 2 end-ugly-syntax
Run Code Online (Sandbox Code Playgroud)
如果在Lisp中这是不可能的,那么大概是关于什么的呢?这有点像说"你有很棒的强大的宏,允许很酷的DSL,只要这些DSL包含在Lisp语法中".
650*_*502 14
当然,您可以在Lisp中实现您所说的内容.
Lisp和其他语言之间的一个重要区别是没有任何修复,你可以控制读者对输入源代码的每个字符所做的事情.从字面上看.
例如,考虑项目CL-Python及其混合语法Lisp/Python模式.
基本上在该模式下,如果您键入的内容以开括号开头,那么它被认为是Lisp,否则它被认为是Python(包括多行结构).
这种宏/ reader-macro库很少实现,因为s-expression方法的一个主要优点是它可以很好地组合,你可以在现有的宏之上构建其他宏,从而提高语言的水平.
一旦放弃了s表达方法的规律性,编写宏就会变得烦人,因为编写操作代码的代码需要考虑语言的几种不同结构,优先规则,特殊规则,特殊语法形式.
不基于s表达式的语言有时提供真正的宏处理能力,但是在AST级别上工作,即在一些解析处理已经以固定方式完成之后.此外,这些语言中的宏代码看起来很奇怪,因为宏操作,检查或构建的代码看起来不像真正的代码.
有时在其他语言中,您只能找到基本上基于搜索替换的基于文本的宏.要查看一些丑陋的事情可以考虑的例子,可以考虑collect.namedtuple的Python 标准库实现(第284行)以及由于该实现而引起的荒谬限制.
另一个例子说明,一旦你强迫自己采用仅模板方法来避免操作不规则和特殊的套接字语言的复杂性,事情会变得非常复杂,这就是C++模板元编程.
一个简单的基于s表达式的语言和准引用使宏代码更容易编写和读取和理解,这就是为什么Lisp代码不会远离它.不是因为它不能,而是因为没有理由去更糟糕的语法是没有意义的.
在Lisp中,你可以通过添加真正需要的抽象来"弯曲"一点语言,但不会破坏其他所有内容,最重要的是,如果需要的话,不会在未来失去更多弯曲的能力.编写一个宏/读取器宏,使表达式解析C++的噩梦,同时删除了编写更多宏并添加更多结构(或使其难以置信)的能力将是一个荒谬的自杀.
即使像宏一样(infix x + y * z)只是一个练习...我怀疑任何lisper会用它来编写真正的代码......为什么有人会重新引入荒谬的函数/运算符二元性和优先/关联规则的噩梦?如果你不喜欢Lisp那么就不要使用Lisp.
对于利斯佩尔它不是(infix和)那是丑陋的一部分......这是什么在中间.
另外为什么你认为2 + 3*6是"自然"20?因为当你还是个孩子的时候,老师用棍子打你的手掌,直到你做对了?