Clojure 说明:Lisp程序是表达式树
我现在正在学Clojure。我一直在读以下声明: “Lisp程序是表达式树” 我不太确定我是否理解它。有人能给我解释一下吗 谢谢 对于这样的代码:Clojure 说明:Lisp程序是表达式树,clojure,lisp,Clojure,Lisp,我现在正在学Clojure。我一直在读以下声明: “Lisp程序是表达式树” 我不太确定我是否理解它。有人能给我解释一下吗 谢谢 对于这样的代码: (+ (* 8 8) (* 4 4)) 您将拥有以下树: 我建议您阅读“抽象语法树”和Lisp S表达式。我们将Lisp程序视为数据/S表达式/树,因为读取器的存在,即您的程序看到的Lisp的第一部分。读者 将程序文本转换为数据结构 您可以(使用宏)对其进行操作 这个数据结构是递归的——它的元素可以是类似的数据结构——如此类推 例如,Chir
(+ (* 8 8) (* 4 4))
您将拥有以下树:
我建议您阅读“抽象语法树”和Lisp S表达式。我们将Lisp程序视为数据/S表达式/树,因为读取器的存在,即您的程序看到的Lisp的第一部分。读者
- 将程序文本转换为数据结构
- 您可以(使用宏)对其进行操作
(+(*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
- 可以识别符号(如
)和数据结构(如列表) 建造李>+
- 这不适用于其他清单数据结构:向量、集合和映射
- 如果运算符是一个函数,则它在程序运行时工作。如果它是一个宏,它会立即在读取器构建的结构中工作李>
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))"))