我正在学习Clojure。我继续阅读以下声明:
“Lisp程序是表达式树”
我不太清楚我理解它。有人可以向我解释一下吗?
谢谢!
答案 0 :(得分:9)
对于这样的代码:
(+ (* 8 8) (* 4 4))
您将拥有以下树:
我建议阅读“抽象语法树”和Lisp S-Expressions。
答案 1 :(得分:3)
我们认为Lisp程序是数据/ S表达式/树,因为存在 reader ,这是程序看到的Lisp的第一部分。读者
这种数据结构是递归的 - 它的元素可以是类似的数据结构 - 所以它等等。
例如,Chiron的答案(+ (* 8 8) (* 4 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))"))