2014-04-09 20 views

回答

9

像这样的代码:

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

您将有以下三种:

LISP Tree

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

3

由于存在阅读器,您的程序看到的Lisp的第一部分,我们将一个Lisp程序看作数据/ S表达式/树。读者

  • 将你的程序的文本到数据结构...
  • ,您可以操控(使用宏)。

这个数据结构是递归的 - 它的元素可以是类似的数据结构 - 所以它依此类推。

例如,在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))"))