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

问题描述 投票:1回答:1

我是一名Clojure程序员初学者,书上说Clojure的优点是不被评估的代码是数据,但我不明白,所以我想得到一个示例代码和解释,以便我能够理解。

我是韩国人。因此,如果您能理解我,即使我写的句子很笨拙,或者没有保持我的礼貌,我也会很感激。

clojure lisp evaluate
1个回答
6
投票

我想你要问的问题是:为什么对于一门编程语言来说,它的源代码在该语言中是作为数据(尤其是作为数据)提供的,这是一个优势。结构化 数据,而不仅仅是字符串)?)

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

一个特别好的案例是,语言的表面形式和代表它的数据结构是相当 "低承诺 "的:它没有编码太多的内容 意思 的程序,只是它的语法形式。

然后,你可以用这种低投入的语言编写程序,其中包括的结构体有 语焉不详. 然后你写其他的程序,把这些程序变成其他的程序,这些程序只使用语言中已经存在的结构。

你可以一直这样做。 所以,你可以从一种语言开始,这种语言就是你所得到的任何一种语言,然后逐步把它构建成一种你想要的语言。

当然,几乎所有的语言都可以做到这一点:几乎所有的语言都可以让你把文件读成字符串,把这些字符串解析成语言的一些表示形式,再加上扩展,然后把这些表示形式处理成原始语言,再交给编译器或解释器。

但是Lisp家族的语言让你的工作变得更加简单。

  • 他们为你做了数据结构的解析,所以 "源代码就是数据"。
  • 它们有一个有意的低承诺的源代码形式, 让你自己决定给定的结构的含义;
  • 它们提供了一些设施,让你通过定义宏,以一种相当简单的方式来处理源码到其他源码的过程。

这就是在语言中以结构化数据的形式提供源代码的好处:它是你需要实现自己的编程语言(这通常真的是一种编程语言)的关键部分。行话 - 一种继承了基础语言的全部内容,但又在基础语言的基础上增加了自己的东西的语言)容易。


1
投票

I 认为 它在 "掌握Clojure Macros" 我看到了一个例子 "代码即数据" 这很有意义(至少对我来说)。

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

(1 + 1)

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

当Clojure读取这个文本时,它会产生一个列表(同一个列表),并允许宏等事物接收它(未评价),将其转换并发送回来。也许那个宏可以简单地交换前两个元素,然后回到 (+ 1 1)?

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

var a = + 1 1; // Syntax error

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

© www.soinside.com 2019 - 2024. All rights reserved.