以前学一个新东西,我总是先去找一本书,慢慢品来. 但是所见高手, 均是去搜一下官方站, 几小时内无师自通.
而我终究不是高手, 因为真的高手, 只需要看一下最基本的东西, 就立即开始上手做事了. 而我似乎没有什么做事的想法, 给自己布置的题目, 往往是全然没有实用价值的.
而且, 合上书, 一上手, 最简单的题目也变得复杂起来, 就如这么多年的大学没有讲习过一样, 要从最简单的状态开始思想.

无所谓了, 当作闲来润笔, 比玩别人计谋好的游戏舒坦.

clojure的作者叫 Rich Hickey, 里奇黑奇.

clojure 是通用语言, 开发环境像写脚本, 互动性强, 内在结构适于写多线程程序. 编译而非解释, 动态, 在运行而非编译时保证各功能, 打通了java平台.

源于lisp, 以代码为数据, 有宏.
函数式编程, 不可变更的数据结构, 需要可更的话, clojure 有transactional内存系统, 交互agent系统来保证多线程中的数据.

想赚钱就得用java, JVM生态是行业标准. 但是java写起来太痛苦, 人生用在强制面向对象和与编译器细节对抗, 不能玩玩动态语言.

选clojure的理由不外乎四条:
喜欢lisp, 函数式编程, 与大平台生态共生, 并发编程.

lisp的优势是词法简单, 代码与数据表达一致, 麻烦的是, common lisp生态过于复杂, scheme生态过于简单, 即使是common lisp, 平台生态也没有足够的大公司支持来形成共的大系统.

函数式编程配合不可更改的数据结构才够纯, 而且clojure所有的数据结构都支持递归, 而lisp里,只有list支持递归.

clojure跑在jvm上, (也有跑在.net上的版本叫clojure-CLR), 语言本身无需处理垃圾回收,也不必考虑跨系统的移植.

多态与面向对象其实是可以分离的. transactional内存和agent系统 对并发编程的支持可以把程序员从设锁解锁的困境中解决出来.

好了, 在有写程序的感性认识之前, 说再多特征都没有用.

Mac OS 安装clojure:

brew install clojure/tools/clojure

再安装一个叫leinigen的项目自动化工具, 我把它理解成 clojure 里的make, leinigen是德语,意思是衣服里的"衬里"(英文:lining)

brew install leinigen

接下来是编辑器, 我用的是spacemacs, 只需要在
dotspacemacs-configuration-layers里加入clojure, reload .spacemacs 文件.

leinigen 和 spacemacs 可以慢慢熟, 第一个要玩熟的是repl. (Read Eval Print Loop, 读, 品论, 印刷, 循环)

repl 可随意执行代码, 看结果, 交互开发. clojure的开发过程与repl紧密相关. 除了clojure还有别的语言有类似repl: lisp, ruby, php, python, node.

shell下启动repl的方式:

lein repl

显示内容如下时, 说明repl已经可以工作了:

nREPL server started on port 55908 on host 127.0.0.1 - nrepl://127.0.0.1:55908
REPL-y 0.5.1, nREPL 0.8.3
Clojure 1.10.3
OpenJDK 64-Bit Server VM 18.0.1.1+0
Docs: (doc function-name-here)(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1, *2, *3, an exception in *e
user=>

输入clojure代码玩玩:

(println "Hello, World!")

调用一下帮助函数

(doc println)

调用一下java帮助函数

(javadoc java.uitl.Date)

能看成果, 说明基本环境已经具备, 可以开始学习语言本身的细节了.