Clojure 说明:Lisp程序是表达式树

Clojure 说明:Lisp程序是表达式树,clojure,lisp,Clojure,Lisp,我现在正在学Clojure。我一直在读以下声明: “Lisp程序是表达式树” 我不太确定我是否理解它。有人能给我解释一下吗 谢谢 对于这样的代码: (+ (* 8 8) (* 4 4)) 您将拥有以下树: 我建议您阅读“抽象语法树”和Lisp S表达式。我们将Lisp程序视为数据/S表达式/树,因为读取器的存在,即您的程序看到的Lisp的第一部分。读者 将程序文本转换为数据结构 您可以(使用宏)对其进行操作 这个数据结构是递归的——它的元素可以是类似的数据结构——如此类推 例如,Chir

我现在正在学Clojure。我一直在读以下声明:

“Lisp程序是表达式树”

我不太确定我是否理解它。有人能给我解释一下吗

谢谢

对于这样的代码:

(+ (* 8 8) (* 4 4))
您将拥有以下树:


我建议您阅读“抽象语法树”和Lisp S表达式。

我们将Lisp程序视为数据/S表达式/树,因为读取器的存在,即您的程序看到的Lisp的第一部分。读者

  • 将程序文本转换为数据结构
  • 您可以(使用宏)对其进行操作
这个数据结构是递归的——它的元素可以是类似的数据结构——如此类推

例如,Chiron答案中的表达式,
(+(*8)(*4))
,由读者转换为

(clojure.lang.PersistentList
 [clojure.lang.Symbol +]
 (clojure.lang.PersistentList
  [clojure.lang.Symbol *]
  [java.lang.Long 8]
  [java.lang.Long 8])
 (clojure.lang.PersistentList
  [clojure.lang.Symbol *]
  [java.lang.Long 4]
  [java.lang.Long 4]))
每个元素前面都有其类型

  • 4
    等文本进行完全评估
  • 可以识别符号(如
    +
    )和数据结构(如列表) 建造
您可以在表示整个表达式的列表中看到表示子表达式的列表

Lisp将每个列表视为第一个元素(运算符)对其他元素的应用,并将其作为参数。因此,每个操作符下都有若干个元素(可能是零)。因此,我们认为列表的层次结构是一棵树

  • 这不适用于其他清单数据结构:向量、集合和映射
  • 如果运算符是一个函数,则它在程序运行时工作。如果它是一个宏,它会立即在读取器构建的结构中工作
read string
函数显示读取器将从文本表达式生成的结构。这本身不是信息,因为打印它只是以标准格式重建文本

(read-string "(+ (    * 8 8)
         (* 4 4))")
; (+ (* 8 8) (* 4 4))

公开带有类型标记的结构的函数是

(defn typed [form]
  (if (sequential? form)
    (cons (type form) (map typed form))
    [(type form) form]))
因此称为:

(typed (read-string "(+ (* 8 8) (* 4 4))"))