Contra Chuck,Common Lisp 的一个优点是它有一个实现坚持和努力的标准,这样您就可以使用 SBCL(它具有出色的类型检查和推理)进行主要开发,然后,例如,部署为与C 库(使用 ECL 或其他)或作为 .jar 使用 Java 库(使用 ABCL),或使用 Mac 或 Windows 原生 GUI(Clozure,两者)。Common Lisp 具有惊人的跨架构、跨实现和跨时间的可移植性,Common Lispers 在语言的支持下努力保持这种方式。例如,非标准化行为的一个愚蠢分歧是“这是一个特殊变量吗?”这个问题。所以我在我使用的实现中回答了这个问题:
#-abcl
(defun special-variable-p (symbol)
#+ecl(si:specialp symbol)
#+ccl(proclaimed-special-p symbol)
#+sbcl(equal '(:special t)
(multiple-value-list-int:info :variable :kind symbol)))
这在读取时将 ABCL 上的任何内容(它已经有)减少到(defun special-variable-p (symbol) (si:specialp symbol))
ECL 上,等等。所以我可以把它放在我的 .rc 文件中,并在 REPL 中使用通用函数。但这不是很重要:这不是线程或各种支持的网络或通信顺序进程库。最后一个示例只有一个#+sbcl/#-sbcl
,即使它在五个实现上运行。因为它依赖于经过仔细移植的代码。
但是,允许这种(和其他)优势的因素也对学习者提出了挑战:Common Lisp 是一种非常大的语言。这不是你可以在一两个星期内啜饮的东西,就像我做 Clojure 一样(但我的 Clojure 已经随着即将推出的重大更改而衰落——这种语言虽然有其自身的优点,但通过对比提醒我很多我喜欢 Common Lisp 的地方。)所以你应该阅读这个页面的很多内容,并让 HyperSpec 远离按键(对我来说,M-x hyperspec RET do-symbols RET
足够接近圣经了。),并考虑买几本书。我有Practical Common Lisp,刚刚得到Let Over Lambda,现在很快就会真正购买PAIP 。
但是,即使 Common Lisp 是真正的答案,你也不会完全浪费你的时间来“选择”一些看似华丽的替代品(——“欺骗性”,因为普通的 CL 并没有向你展示它的宏可以做的所有事情,而且它宏的种类比任何人都多。通常的比较是糟糕的 CL 和语法优化的替代方案 X)。您仍然会学习基础知识,您仍然可以使用在 SICP、On Lisp、The Little Schemer等中可以阅读的大部分内容。lisp,即使是错误的 lisp,仍然比非 lisp 好。(但是你会花一些时间在错误的 lisp 中实现正确的 lisp 的某些部分。Meta-Greenspun。)