在Lisp中,代码是数据。这有什么好处?

在Lisp中,代码是数据。这有什么好处?,lisp,Lisp,在Lisp中,任何程序的代码实际上都是有效的数据结构。例如,这将一项和二项相加,但它也是一个包含三项的列表 (+ 1 2) 这有什么好处?在其他语言中,是什么让你能够做到不可能和/或不那么优雅的事情呢?我最喜欢的例子。。。在大学里,我的一些朋友在用Lisp编写编译器。所以他们所有的数据结构包括解析树都是lisp s表达式。到了实现代码生成阶段时,他们只需执行解析树。它允许您编写宏,将一个列表树转换为另一个列表树。简单(方案)示例: 注意宏调用是如何简单地与(and)、(and thing)和(

在Lisp中,任何程序的代码实际上都是有效的数据结构。例如,这将一项和二项相加,但它也是一个包含三项的列表

(+ 1 2)

这有什么好处?在其他语言中,是什么让你能够做到不可能和/或不那么优雅的事情呢?

我最喜欢的例子。。。在大学里,我的一些朋友在用Lisp编写编译器。所以他们所有的数据结构包括解析树都是lisp s表达式。到了实现代码生成阶段时,他们只需执行解析树。

它允许您编写宏,将一个列表树转换为另一个列表树。简单(方案)示例:

注意宏调用是如何简单地与
(and)
(and thing)
(and thing rest…)
子句匹配的(取决于调用的算术性),并得到适当的处理

在其他语言中,宏必须处理被转换代码的某种内部AST——否则就不会有一种简单的方式以编程格式“查看”代码——这会增加编写宏的摩擦


在LISP程序中,宏通常使用得很频繁,确切地说是因为编写它们的摩擦力很低。

< P>为了使代码表示更清楚一些,请考虑在每种语言代码中都是数据:您所需要的只是字符串。(也许还有一些文件操作。)思考这如何帮助您模仿拥有宏系统的Lisp好处是一个很好的启示。如果您尝试实现这样一个宏系统,效果会更好。您将遇到结构化表示与字符串的平坦性相比的优势,需要首先运行转换并定义“语法挂钩”来告诉您在哪里应用它们,等等

但在所有这些中,您将看到的主要内容是,宏本质上是编译器挂钩的一种方便工具——那些挂钩在新创建的关键字上的编译器挂钩。因此,唯一真正需要的是让用户代码与编译器代码交互的方法。扁平字符串是一种方法,但它们提供的信息太少,宏编写器只能从头开始实现解析器。另一方面,您可以公开一些内部编译器结构,如预解析的AST树,但这些结构往往会公开太多信息,这意味着编译器需要以某种方式能够解析您要实现的新语法扩展。对于后者,S表达式是一个很好的解决方案:编译器可以解析任何东西,因为语法是统一的。它们也是前者的一个解决方案,因为它们是简单的结构,有着丰富的语言支持,可以将它们分解并以新的方式重新组合


但这当然不是故事的结局。例如,比较CL中的普通符号宏和Scheme实现中的卫生宏是很有趣的:它们通常通过向表示的数据添加更多信息来实现,这意味着您可以对这些宏系统做更多的工作。(由于附加信息也可用,您还可以对CL宏执行更多操作,但它不是语法表示的一部分,而是作为附加环境参数传递给宏。)

Lisp是为处理各种符号数据而开发的。事实证明,人们也可以将任何Lisp程序视为符号数据。因此,您可以将Lisp的操作功能应用于它本身

如果要使用程序进行计算(创建新程序、将程序编译为机器代码、将程序从Lisp翻译为其他语言),基本上有三种选择:

  • 使用字符串。这会一直导致冗长的字符串解析和解析

  • 使用解析树。有用但变得复杂

  • 使用Lisp中的符号表达式。程序被准备成熟悉的数据结构(列表、符号、字符串、数字等),操作例程用提供功能的常用语言编写


那么Lisp给你带来了什么?编写操纵其他程序的程序的相对简单的方法。从宏到编译器,有很多这样的例子。您还可以轻松地将语言嵌入到Lisp中。

这可能会作为一个复制关闭…()以下是维基百科上的相关片段:Peter Seibel编写的实用通用Lisp是对通用Lisp的一个非常好的介绍,其中包括了演示宏的早期章节:这个问题似乎有点倒退:您正在考虑Lisp设计的结果,并询问如何处理它。实际上,我从做事开始。(在Java中,int是32位的——这有什么好处?好吧,我们可能会列出一些,但它们看起来很做作,因为没有Java程序员会从这个方向思考。)@Ken我明白你的意思了。然而,我问这个是出于好奇。我已经在用其他语言做事情了,我从来没有觉得我的代码需要数据。我只是想知道我遗漏了什么,伊莱做了一个很棒的解释。这是一个很棒的解释。非常感谢。
(define-syntax and
  (syntax-rules ()
   ((and) #t)
   ((and thing) thing)
   ((and thing rest ...) (if thing (and rest ...) #f))))