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

I want to know why it is advantage in Clojure for a code to be not evaluated is data

我是一名初学者 Clojure 程序员。 在一本书中,Clojure 的一个优势是未评估的代码是数据。 但是我不理解。 所以,我想要一个示例代码和解释,以便我理解。

我是韩国人。因此,即使我写了一个笨拙的句子或没有保持礼貌,如果您能理解,我将不胜感激。

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

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

一个特别好的例子是语言的表面形式和表示它的数据结构相当'low-commitment':它没有编码很多意义程序,只是它的语法形式。

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

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

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

但是 Lisp 家族语言让这对你来说更容易:

  • 他们为您解析成数据结构,所以 'source code is data';
  • 他们有一个特意低承诺的源代码形式,由您决定给定结构的含义;
  • 它们提供的工具可以让您通过定义宏以一种相当轻松的方式将源代码处理成其他源代码。

这就是将源代码作为语言中的结构化数据提供的优势:它是实现自己的编程语言(通常实际上是一种编程 行话 – 一种继承了所有基础语言但在其之上添加了自己的东西的语言)简单。

认为是在"Mastering Clojure Macros"看到一个"code is data"的例子赚了很多有意义(至少对我而言)。

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

(1 + 1)

但这不是一个有效的程序!如果你在你的 REPL 中评估它,它会抛出一个错误,因为 1 不是一个函数。

当 Clojure 读取此文本时,它会生成一个列表(同一个列表)并允许诸如宏之类的东西接收它(未计算),对其进行转换并发回.也许那个宏可以简单地交换前两个元素和 return (+ 1 1)?

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

var a = + 1 1; // Syntax error

引擎早就爆炸了,你还没来得及尝试任何东西!