首页 > lisp的代码即数据到底有什么优势?可否举个简单的例子说明?

lisp的代码即数据到底有什么优势?可否举个简单的例子说明?

在实际的项目应用中有什么方便之处吗?


单就“代码即数据”这一点而言,没有优势,随便哪个有eval功能的脚本语言都可以做同样的事。
Lisp的优势在于,用于保存代码的数据结构就是Lisp中唯一的、通用的数据结构S-Expr,你可以用任何处理S-Expr的方式来处理和生成代码,实现所谓的Meta-programming。
不过这个功能说实话对于普通程序员其实也没多大用处,一不小心就会被同事暴打


我倒是覺得這算是一個誤解。

代碼仍是代碼,數據仍是數據,二者的形式相同(或者相似),但是本質不同。原始LISP中有一個quote算子,就是為了做這一點區分的。如

(add 1 2)
'(add 1 2) == (quote add 1 2)

數據比代碼多了一個點(笑)。
在我的新設計中,同樣的東西被表示為

(add 1 2)
[add 1 2]

前者表示求和1與2,後者表示一個列表,包括算子add 數字1 和數字2 三個原子。
如我這樣的表示,quote算子就是多餘的了,然後七個標準元算符就減少到了六個。
原因就是,代碼仍是代碼,數據仍是數據,二者的形式相同(或者相似),但是本質不同。


代码即数据指的是 “同像性”, 什么是同像性呢?
同像性就是意味着数据和代码可以用一样的数据结构表示,比较lisp,都是S表达式
同像性也是lisp的标志之一

代码在语言中是first class的,然后才能成就lisp的宏, 你可以像操纵数据结构一样操作你的代码,

然后就是你可以写代码来生成代码


主要是在写宏的时候比较有优势。不过也可以直接把一段数据当成代码来用,比如这样(以下代码只是说明可这种可能性,下面这段代码本身意义不大):

;; *func-list* is just a list, but *func* is a callable function.
(defparameter *func-list* '(lambda (n) (1+ n)))
(defparameter *func* (coerce *func-list* 'function))
(funcall *func* 1) ;; => 2

当然,比较好也是比较正常的用法是用eval来充当运行时的编译/解释器,我上面这个就算是抛砖引玉了。


可以用代码生成代码和方便写宏这两点其他答案都有说了,另一个重要的功能是可以很方便地实现反射。

【热门文章】
【热门文章】