2
A
回答
9
像这样的代码:
(+ (* 8 8) (* 4 4))
您将有以下三种:
我建议阅读关于 “抽象语法树” 和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))"))
相关问题
- 1. C++程序中的Lisp解释器
- 2. 表达式树序列化程序
- 3. 解释一下这个PHP正则表达式的手段(preg_match_all)
- 4. 解释正则表达式
- 5. 正则表达式解释
- 6. 正则表达式解释
- 7. PHP - 解释REGEX表达式
- 8. ANTLR表达式解释器
- 9. 正则表达式解释
- 10. 解释正则表达式
- 11. 请解释此表达式
- 12. F#表达式树解释器的实现
- 13. 解析器树或表达式树
- 14. LISP表达式列表
- 15. 请解释一下这个正则表达式呢?
- 16. 解释lambda表达式的列表
- 17. Lisp函数解释
- 18. 解释这一BASH表达
- 19. LINQ表达式树是否合适树?
- 20. 编译的表达式树木误解?
- 21. Perl的正则表达式的解释
- 22. 这个C++表达式是如何解释为一个调用?
- 23. Lisp代码的解释
- 24. 使用表达式树的另一种表达树
- 25. 表达式树
- 26. 正则表达式的解释
- 27. 需要正则表达式的解释
- 28. 正则表达式的解释
- 29. vim的正则表达式解释
- 30. 解释繁琐的条件表达式