解释一下:Lisp程序是表达式的树

时间:2014-04-09 08:00:14

标签: clojure lisp

我正在学习Clojure。我继续阅读以下声明:

“Lisp程序是表达式树”

我不太清楚我理解它。有人可以向我解释一下吗?

谢谢!

2 个答案:

答案 0 :(得分:9)

对于这样的代码:

(+ (* 8 8) (* 4 4))

您将拥有以下树:

LISP Tree

我建议阅读“抽象语法树”和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))"))