在Lisp中,任何程序的代码实际上都是有效的数据结构.例如,这会将一个和两个加在一起,但它也是三个项目的列表.
(+ 1 2)
Run Code Online (Sandbox Code Playgroud)
这提供了什么好处?是什么让你在其他语言中做到不可能和/或不那么优雅?
Eli*_*lay 18
为了使代码表示更清晰,请考虑在每种语言代码中都是数据:您需要的只是字符串.(也许还有一些文件操作.)考虑如何帮助你模仿拥有宏系统的Lisp好处是一种很好的启蒙方式.如果你试图实现这样的宏系统,那就更好了.你会遇到结构化表示与字符串平坦性,首先运行转换并定义"语法挂钩"以告诉你应用它们的位置等等的优点.
但是你会在所有这些中看到的主要内容是宏本质上是一个方便的编译钩子工具 - 那些挂钩新创建的关键字.因此,真正需要的唯一方法是让用户代码与编译器代码交互.扁平字符串是一种方法,但它们提供的信息很少,以至于宏编写器的任务是从头开始实现解析器.另一方面,你可以暴露一些内部编译器结构,如预解析的AST树,但那些往往暴露太多信息以方便,这意味着编译器需要以某种方式能够解析你的新语法扩展打算实施.S表达式是后者的一个很好的解决方案:编译器可以解析任何东西,因为语法是统一的.它们也是前者的解决方案,因为它们是简单的结构,并且语言的丰富支持使它们分开并以新的方式重新组合它们.
但当然,这不是故事的结局.例如,它们也同样吸引普通的符号宏作为CL和卫生宏比较,如方案实施:这些通常是通过增加更多的信息来表示的数据,这意味着你可以用这些宏观系统做更多的实现.(您也可以使用CL宏执行更多操作,因为额外的信息也可用,但它不是将其作为语法表示的一部分,而是作为宏的额外环境参数传递.)
我最喜欢的例子......在大学里,我的一些朋友正在用Lisp编写一个编译器.因此,包括解析树在内的所有数据结构都是lisp s表达式.当是时候实现他们的代码生成阶段时,他们只是执行他们的解析树.
Lisp 是为操作各种符号数据而开发的。事实证明,我们也可以将任何 Lisp 程序视为符号数据。所以你可以将 Lisp 的操作能力应用到它自己身上。
如果你想用程序进行计算(创建新程序、将程序编译为机器代码、将程序从 Lisp 翻译为其他语言),基本上有三种选择:
使用字符串。这总是会导致繁琐的解析和反解析字符串。
使用解析树。有用但变得复杂。
使用像 Lisp 中那样的符号表达式。程序被准备成熟悉的数据结构(列表、符号、字符串、数字……),并且操作例程以提供功能的常用语言编写。
那么使用 Lisp 会得到什么呢?一种编写操作其他程序的程序的相对简单的方法。从宏到编译器有很多这样的例子。您还发现可以轻松地将语言嵌入到 Lisp 中。
归档时间: |
|
查看次数: |
7102 次 |
最近记录: |