![4ef140cac8fe389f5013b245ee45cf35.png](https://i-blog.csdnimg.cn/blog_migrate/bbce712f255bb3dfd4ea8e18dd5b6b34.jpeg)
Common Lisp下称CL。
难度大
我学Lisp很费劲,就个人而言Lisp是投入精力第二多的IT技术(仅次于C++)。CL的宏屡屡让我绝望,感觉比C++的模板元编程还难。
解:忍 || 滚
用途少
搜一下会发现:用CL的公司很少,工作机会也很少。我只用CL为他人写过几个小工具,其实也可以用Python实现。
解:“有条件要用Lisp,没有条件创造条件也要用Lisp”。
方言多
CL、Schema、Clojure、newLISP等等,各有所长,选择困难。
解:我学Lisp目的是作为主力语言(而非脚本)开发实用程序和项目,所以选CL。
实现杂
选定CL,还有十几种开源、商业实现待选。
解:看完Wiki再浏览一遍各CL实现的官网,目前多数凉凉,我选开发最活跃的SBCL。
编辑器陌生
对开源CL实现来说,目前Emacs是唯一选择,但我对Emacs重度应用Ctrl键深恶痛绝。
解:我熟悉VIM键位,用Spacemacs。
语法独特
直接写语法树,需要直面层层叠叠的括号。下面是SBCL的部分代码,大家感受一下:
……
(funcall dst-set-fn dst dst-word-offset
(word-logical-or (word-logical-and value mask)
(word-logical-andc2 orig mask)))))))))))))))))
解:忍。其实习惯后影响不大,括号交给编辑器匹配。
开发方式独特
与我熟悉的“编辑-构建-调试-运行”方式不同,Lisp开发用Read-Evaluate-Print Loop (REPL)工作循环。没有main函数,我从哪开始写、程序从哪开始运行呢?
解:REPL是优点,其他语言纷纷借鉴:Python有ipython/bpython、Java9引入JShell、C++有ch。
基础语法繁琐
字符串拼接:(concatenate 'string a b)
C++:a + b
变量交换:(rotatef a b)
C++:swap(a, b)
设置数组元素:(setf (svref v i) 123)
C++:v[i] = 123
判断大写字母:(lower-case-p #a)
C++:islower('a')
解:只是“基础语法”繁琐,CL有“宏”和很多高阶函数,得写到一定层次才能把总体代码量挽回来。
整体生态对Windows支持不完善。
SBCL在Windows上一般落后好几个版本。
解:但总体情况越来越好,Windows版的CL和Emacs都日趋稳定。