gpt4 book ai didi

clojure - 在 Clojure 中使用引用

转载 作者:行者123 更新时间:2023-12-02 06:30:48 25 4
gpt4 key购买 nike

在 clojure 中引用会导致不评估。 ':a:a 返回相同的结果。 ':a 和 :a 之间有什么区别?一个不评估,另一个评估自身......但这与不评估相同吗?

最佳答案

  1. ':a(quote :a) 的简写.

  2. (eval '(quote form))返回form根据定义。也就是说,如果Clojure函数eval接收一个列表结构作为其参数,其第一个元素是符号 quote ,它返回所述列表结构的第二个元素,而不以任何方式对其进行转换(因此据说不评估引用的形式)。换句话说,行为 eval当其参数是 (quote foo) 形式的列表结构时调度到是返回foo不变,无论它是什么

  3. 当您写下文字 :a 时在您的程序中,它作为关键字 :a读入 ;即具体的文本:a被转换为内存中的数据结构,恰好被称为 :a关键字(Lisp 是同形的,这意味着有时很难区分 Lisp 数据的文本表示和数据本身,即使这对于解释目的很有用......)。

  4. 与文字 :a 对应的内存数据结构是一个 Java 对象,它公开了许多方法等,并且具有函数 eval 的有趣属性。 ,当它接收到此数据对象作为参数时,将其原样返回。换句话说,您所询问的关键字的“对自身的评估”只是行为eval当传入关键字作为参数时调度到。

  5. 因此当 eval看到':a ,它将其视为引用形式并返回其第二部分,恰好是 :a 。另一方面,当 eval看到:a ,它将其视为关键字并原封不动地返回。两种情况下的返回值是相同的(只是关键字 :a );评估过程略有不同。

  6. Clojure 语义——实际上是 Lisp 语义,对于 Lisp 的任何方言来说——是根据函数 eval 返回的值和引起的副作用来指定的。当它接收各种 Lisp 数据结构作为参数时。因此,上面解释了当你写下 ':a 时实际上会发生什么。或:a在你的程序中(像 (println :a) 这样的代码可能会被编译成高效的字节码,当然,它实际上并不编码函数 eval ;但语义总是被保留,所以它仍然表现得就像 它是 eval 接收包含符号 println 和关键字 :a 的列表结构。

  7. 这里的关键思想是,无论正在评估的表单是否为 ':a:a ,关键字数据结构是在读取时构造的;然后,当评估其中一种形式时,该数据结构将原封不动地返回——尽管出于不同的原因。

关于clojure - 在 Clojure 中使用引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com