我是一名Clojure程序员初学者,书上说Clojure的优点是不被评估的代码是数据,但我不明白,所以我想得到一个示例代码和解释,以便我能够理解。
我是韩国人。因此,如果您能理解我,即使我写的句子很笨拙,或者没有保持我的礼貌,我也会很感激。
我想你要问的问题是:为什么对于一门编程语言来说,它的源代码在该语言中是作为数据(尤其是作为数据)提供的,这是一个优势。结构化 数据,而不仅仅是字符串)?)
它是一个优势的原因很简单:一旦你能访问一个代表程序源的数据结构,你就可以操纵这个结构:你可以编写操纵其他程序的程序。
一个特别好的案例是,语言的表面形式和代表它的数据结构是相当 "低承诺 "的:它没有编码太多的内容 意思 的程序,只是它的语法形式。
然后,你可以用这种低投入的语言编写程序,其中包括的结构体有 语焉不详. 然后你写其他的程序,把这些程序变成其他的程序,这些程序只使用语言中已经存在的结构。
你可以一直这样做。 所以,你可以从一种语言开始,这种语言就是你所得到的任何一种语言,然后逐步把它构建成一种你想要的语言。
当然,几乎所有的语言都可以做到这一点:几乎所有的语言都可以让你把文件读成字符串,把这些字符串解析成语言的一些表示形式,再加上扩展,然后把这些表示形式处理成原始语言,再交给编译器或解释器。
但是Lisp家族的语言让你的工作变得更加简单。
这就是在语言中以结构化数据的形式提供源代码的好处:它是你需要实现自己的编程语言(这通常真的是一种编程语言)的关键部分。行话 - 一种继承了基础语言的全部内容,但又在基础语言的基础上增加了自己的东西的语言)容易。
I 认为 它在 "掌握Clojure Macros" 我看到了一个例子 "代码即数据" 这很有意义(至少对我来说)。
从语法上讲,这是有效的Clojure代码:它是一个简单的数字和符号列表。
(1 + 1)
但它不是一个有效的程序! 如果你在你的 REPL 中评估这个程序,它将抛出一个错误,因为 1
并不是一个函数。
当Clojure读取这个文本时,它会产生一个列表(同一个列表),并允许宏等事物接收它(未评价),将其转换并发送回来。也许那个宏可以简单地交换前两个元素,然后回到 (+ 1 1)
?
例如,这在JavaScript中是不可能的。
var a = + 1 1; // Syntax error
在你尝试任何事情之前,引擎就已经爆炸了!