5 个回答

代码即数据指的是 “同像性”, 什么是同像性呢?
同像性就是意味着数据和代码可以用一样的数据结构表示,比较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来充当运行时的编译/解释器,我上面这个就算是抛砖引玉了。

单就“代码即数据”这一点而言,没有优势,随便哪个有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算子就是多餘的了,然後七個標準元算符就減少到了六個。
原因就是,代碼仍是代碼,數據仍是數據,二者的形式相同(或者相似),但是本質不同。

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏