我想知道为什么在 Clojure 中,不被评估的代码是数据的优势

Suh*_*HOI 1 lisp clojure evaluate

我是一名初学 Clojure 程序员。在 Book 中,Clojure 的一个优点是不求值的代码是数据。但是我不理解。所以,我想要一个示例代码和一个解释,以便我能理解。

我是韩国人。因此,即使我写了一个尴尬的句子或未能保持我的礼貌,如果你能理解,我将不胜感激。

小智 6

我认为您要问的问题是:为什么编程语言的源代码作为数据(尤其是结构化数据,而不仅仅是字符串)在语言中可用是一种优势?

它是一个优势的原因很简单:一旦您可以访问表示程序源的数据结构,您就可以操纵该结构:您可以编写操纵其他程序的程序。

一个特别好的例子是语言的表面形式和表示它的数据结构相当“低承诺”:它没有编码程序的太多意义,只是它的句法形式。

然后,您可以使用这种低承诺语言编写程序,其中包括该语言中尚不存在的结构。你编写其他程序,这些程序将这些程序转换成其他程序,这些程序只使用语言中已经存在的结构。

你可以继续这样做。因此,您可以从任何给定的语言开始,然后逐步将其构建为您想要的语言。

当然,您几乎可以使用任何语言执行此操作:使用几乎任何允许您将文件读入字符串、将这些字符串解析为某种语言的表示形式、带有扩展名的语言,然后将该表示形式处理为原始语言,然后再将其处理到编译器或解释器。

但是 Lisp 家族语言让你更容易做到这一点:

  • 他们为你解析成数据结构,所以“源代码就是数据”;
  • 他们有一个故意低承诺的源形式,让你决定给定的结构意味着什么;
  • 通过定义宏,它们提供了让您以一种相当轻松的方式将源代码处理为其他源代码的工具。

这就是将源代码作为语言中的结构化数据提供的优势:它是实现您自己的编程语言所需的关键部分(这通常是一种编程术语——一种继承所有基础语言的语言,但在它上面添加一些自己的东西)容易。