我想知道为什么在 Clojure 中不计算代码是数据的优势



我是一个初学者Clojure程序员。 在一本书中,Clojure的一个优点是,不计算的代码是数据。 但我不明白。 所以,我想要一个示例代码和一个解释,以便我理解。

我是韩国人。出于这个原因,即使我写了一个尴尬的句子或未能保持我的举止,如果您能理解,我将不胜感激。

我认为您要问的问题是:为什么编程语言的源代码在语言中作为数据(特别是作为结构化数据,而不仅仅是字符串(提供具有优势?

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

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

然后,您可以使用这种低承诺语言编写程序,其中包括该语言中尚不存在的构造。 然后你编写其他程序来获取这些程序,并将它们转换为其他程序,这些程序仅使用语言中已经存在的构造。

你可以继续这样做。 因此,你可以从一种语言开始,它是你得到的任何语言,然后逐步构建成一种你想要的语言。

当然,你几乎可以使用任何语言来做到这一点:在几乎任何语言中,你可以将文件读入字符串,将这些字符串解析为语言的某种表示形式,带有扩展名,然后将该表示处理为原始语言,然后交给编译器或解释器。

但是 Lisp 系列语言使你更容易:

  • 他们为您解析为数据结构,因此"源代码就是数据";
  • 它们有一个故意低承诺的源形式,由你决定给定的构造的含义;
  • 它们提供了一些工具,让您通过定义宏,以一种相当轻松的方式将源代码处理到其他源代码。

这就是将源代码作为结构化数据提供语言的优势:它是实现自己的编程语言(这通常实际上是一个编程术语- 一种继承所有基础语言但在其上添加自己的语言(所需的关键部分。

我认为在"掌握Clojure宏"中,我看到了一个"代码就是数据">的例子,这很有意义(至少对我来说(。

从语法上讲,这是有效的Clojure代码:它是一个简单的数字和符号列表。

(1 + 1)

但它不是一个有效的程序!如果您在 REPL 中评估此值,它将引发错误1因为这不是函数。

当 Clojure 读取此文本时,它会生成一个列表(相同的列表(,并允许宏等内容接收它(未评估(、转换它并将其发送回去。也许该宏可以简单地交换前两个元素并返回(+ 1 1)

这在 JavaScript 中是不可能的,例如:

var a = + 1 1; // Syntax error

在你尝试任何事情之前,引擎就会爆炸!

最新更新