- 学习 Clojure 一般是用
lein repl启动控制台, 每次启动lein repl都会发现它打开了一个端口, 例如➜ ~ lein repl
一直不清楚上面显示的
nREPL server started on port 57212 on host 127.0.0.1 - nrepl://127.0.0.1:57212
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
...........nrepl://127.0.0.1:57212该作何用, 而且端口号是随机的, 这其中定有文章.
幸好有 Google 帮忙, 查一查, 然后才意识到何不运行lein help repl来看看repl中到底有何玄机, 原来是:
<none> -> :startlein repl默认的行为, 见下. 未指定 :host 或 :port , :host 默认为 127.0.0.1, :port 为随机
:start [:host host] [:port port] 原来lein repl设计为为 CS 结构. :start 会启动一个 nREPL server, 并且立即启动一个 client 连接上它. :host 默认为 127.0.0.1, :port 默认为随机的
:headless [:host host] [:port port] 只启动 nREPL server, 等待别人来连接它, 相同的默认 :host, :port 规则. 也就是它不会进到 Clojure 控制台
:connect [dest] 连接一个 nREPL server. 目标服务器的指定有三种方式: HTTPS(S) URL, host:port, 或 port Read More
Clojure 确实要比 Python 语义上庞大, 所以无法尽量在一篇之中收纳进来, 只得另立新篇, 也许还会有第三篇笔记. 现在开始学习函数定义函数定义
函数用defn宏来定义, 函数名与参数列表之间可选的字符串是函数的注释, 相当于 Python 的函数体中第一个字符串, 这个字符串能被(doc func-name)列出来, Python 中是用dir(fun_name显示函数帮助. 不需要 return 关键字, 和 Groovy/Scala 一样最后一个表达式的值为函数的返回值, 所以函数总是有返回值(或为 nil).
和 C 语言一样, 函数必须先定义再使用, 否则要用(declare function-names)提前声明, 下面代码是在 Clojure 的 REPL 中执行的user=> (defn say-hello-to "say hello to some" [name] (str "Hello, " name)) #'user/say-hello-to user=> (doc say-hello-to) ------------------------- user/say-hello-to ([name]) say hello to some nil user=>
提一下 Clojure 的命名规则, 变量和函数名用中划线连接的小写单词.defn-定义的函数是私有, 只对当前名字空间可见, 比如上面的 user 名字空间. 有点像 Python 的下划线变量或函数的可见性约定. Read More
自己所学过的编程语言基本是 C 风格的, 给自己定下的目标是要学习下 Python, Swift 和 Clojure. 正如之前的 我的 Python 快速入门 那样的几分钟入门, 这里记录下 Clojure 的快速上手过程.
为什么是 Clojure, 因为它是 Lisp 的一个方言, 个人觉得有必要拓展一下不同的语言风格与思维方式, 就像当初接触 Objective-C 的 [person sayHello] 的方法调用有点不好理解一样, 其实把它还原为面向对象的本质是向 person 发送 sayHello 消息就简单了.编程语方不仅仅是一种技术, 它更是一种思维习惯
希望通过 Clojure 这样的语言来感受另样的思维方式. Clojure 是运行在 JVM 之上的函数式 List 方言. Clojure 乍一看, 基本就是一个括号语言, 它的语法更能体现操作/函数为中心. Clojure 的圆括号兼具 C 风格语言的圆括号(参数列表), 分号(分隔语句), 以及大括号(限定作用域) 的功能. (1 + 2 + 3 +4) 只用写成 (+ 1 2 3 4)。
因为 Clojure 是构筑在 JVM 之上, 所以可以从 http://clojure.org/community/downloads 下载 clojure 的 jar 包, 然后java -jar clojure-1.8.0.jar
就能进到 Clojure 的 REPL(read-eval-print-loop) 控制台了, 就可以开始体验 Clojure 的代码user=> (+ 1 2 3),如果要运行一个已经写好的 Clojure 文件, 如 hello.clj, 就要用java -jar clojure-1.8.0.jar hello.clj来执行. 为方便可以建立一个脚本clj, 内容为java -jar /path/clojure.jar $1
Read More