Clojure 入门 已翻译 100%

oschina 投递于 2013/01/09 08:12 (共 14 段, 翻译完成于 03-01)
阅读 6151
收藏 39
6
加载中

我将尝试教一些人(主要是Python开发者,在OS X操作系统运行)如何使用Clojure, 因为我觉得目前已经存在的一些教人如何从零开始学习Clojure的文档不尽如人意。 当我自己在几个月前亲身经历这一切,这是一个奇怪的时期, 好几个星期我一直处于迷茫中, 我基本上找不到一个关于Clojure生态系统的概念路线图,也不知道如何组织一个。

我这篇文章的目标是创建该资源(我本该六个月前就创建它)。我将假设您正使用OS X操作系统并且有些许编程经验。

0595
0595
翻译于 2013/01/09 09:22
1

关于 Clojure 的书籍

你首先应该购买并开始阅读 Clojure Programming. 还有另外一本叫“Programming Clojure” (书名有点容易混淆) ,我不能保证说它更好或者更差, 但我喜欢 “Clojure Programming” 并且一直使用它,所以我推荐它。 写这本书的人都是那些你搜索Clojure社区时常常见到的大牛们的名字。在Clojure社区, 所有主要的人物似乎都毫无人性地多产。

0595
0595
翻译于 2013/01/09 09:39
1

让我们开始吧

现在,让我们开始配置你的环境。 获取Homebrew -“OS X缺省的包管理器” - 准备好后, 运行下面的命令:

brew install clojure

这个命令将安装一个Clojure 副本,你可以通过‘clj’ 命令进行访问。 继续并运行它,你会看到REPL启动, 随便发挥吧。 你会发现自己并不是常常用到这个副本, 但是有它总是好的,特别是当你想直接运行一个Clojure 文件可以通过命令`clj a_file.clj`进行。

你不会经常用到'clj' 是因为REPL默认的原始的Clojure环境非常的垃圾。它不支持使用向上箭头访问之前计算的表达式; 它不支持使用'C-a' 和'C-e'到达每一行的开始/末尾;这真的非常气人, 你会讨厌它的, 因此别使用它。

你下一个步骤是安装Leiningen, 从现在开始你几乎会从不间断地用到它。通常, 你需要安装 Leiningen 2, 虽然它目前还不是Leiningen的公开的发行版本,但相信我它就是你要安装的版本。你可以通过运行下面的命令得到它:

brew install leiningen --devel

这个 --devel 标记, 告诉Homebrew 我们需要的是 Leiningen 2 而不是 Leiningen 1.x. 我花了不少时间才搞懂它。

0595
0595
翻译于 2013/01/10 15:03
1

那么Leiningen究竟是什么鬼东西?

Leiningen是你的主要工具, 它用于:

  • 启动一个 REPL
  • 下载+安装类库
  • 运行你的程序
  • 启动一个服务器, 运行你所写的webapps

接着运行 `lein repl`. 它会启动一个真正有用的 REPL, 任何时候,当你需要一个REPL,用这个命令就行。 使用向上方向键你会得到之前用过的计算表达式, 而快捷键 C-a 和 C-e 也能生效(到达行首/行尾), 一切都像你所期望的那样。另外,如果你在顶级目录运行一个Clojure 项目,它会根据实际情况处理连接类路径和诸如此类的东西,这样你就可以导入和玩玩你项目的代码和库了。 稍后我们再讨论这个。现在,让我们通过下面的命令创建一个骨架项目玩玩:

lein new foo

命令完成后, cd 到 foo 目录,你会看到它已经有了一些文件和目录:

[jrheard@jrheard-air:~/dev/foo] $ ll
total 16
-rw-r--r--  1 jrheard  staff   193B Jan  5 15:17 README.md
drwxr-xr-x  3 jrheard  staff   102B Jan  5 15:17 doc
-rw-r--r--  1 jrheard  staff   263B Jan  5 15:17 project.clj
drwxr-xr-x  3 jrheard  staff   102B Jan  5 15:17 src
drwxr-xr-x  3 jrheard  staff   102B Jan  5 15:17 test
0595
0595
翻译于 2013/01/10 15:43
1
当你写一个Clojure 库/程序/或者任何东西,你的源代码都保存在“src”目录,你的测试代码则保存在“test”目录。非常简单。 让我们来看看 src 目录:
[jrheard@jrheard-air:~/dev/foo] $ cat src/foo/core.clj
(ns foo.core) (defn foo "I don't do a whole lot." [x] (println x "Hello, World!"))

看起来 Leiningen 已经创建了一个叫 “src/foo/core.clj” 的文件。这是一个Clojure程序, 它定义了一个“foo.core”的命名空间, 然后声明该命名空间包含一个名为“foo”的函数。 我们来看看它。用`lein repl`启动一个REPL 并浏览一下。 还记得我前面提到过Leiningen会负责处理你的类路径和相关的goop,这样你就可以从REPL访问你的项目代码了? 看看这个:

user=> (use 'foo.core) nil
user=> foo #<core$foo foo.core$foo@6ad591a6>
user=> (foo "jrheard") jrheard Hello, World!
nil


0595
0595
翻译于 2013/01/10 16:16
1

真棒 - 我们已经能够导入我们的代码并运行它。 `use` 提供了类似于Python里面的`from foo.core import *` 相同 的功能,因此不鼓励在源代码中再使用它( from foo.core import *), 出于相同的原因, import *也不再鼓励使用。不过像 import * ( 这样的功能), 在你查找(浏览)REPL 的时候是相当有用的。

嘿,非常酷 - 我们已经创建了一个项目, 里面还生成一些代码, 我们已经知道如何启动一个能运行的REPL 还可以在里面浏览那些代码。 第一阶段已经完成啦, 让我们来看看第二个阶段:

0595
0595
翻译于 2013/01/11 08:29
1

下装并安装类库

你可能习惯在命令行运行一些命令来获取类库。例如 `pip install this_great_library_i_found`, 它会下载你指定的类库, 并安装到全局的或者你当前的虚拟环境中(virtualenv)。 但是在 Clojure 里, 有一点点不一样。

首先,你必须找到一个看起来还不错的类库。 Clojure Toolbox 是一个奇妙的工具,这是我发现的最好的资源。 我们选择一个库玩玩: 创建HTTP请求很有意思 - 让我们先到 “HTTP Clients” 的章节, 看看我们都有哪些选择。 看起来我们得在 clj-http 和 http.async.client 之间挑一个 - 但是选哪一个呢?

0595
0595
翻译于 2013/01/11 09:05
1

目前,在多个存在竞争关系的类库之间做选择时,我最喜欢的方式是:把它们从github仓库里拉下来,然后比较加星数和fork数之和,如果最近两个月有提交代码可以加分,用这个数代表社区的健壮性、影响力或适应能力,可能不是特别科学,不过我用着挺好的。在写这篇文章的时候,clj-http有242个星号,http.async.client只有127个,所以我选择clj-http。

所以… 怎么搞到它?

让我们打开 clj-http’s github repo。README中关于安装那一段有如下代码:

[clj-http "0.6.3"]
SeabornLee
SeabornLee
翻译于 2013/01/13 00:00
2

这就是我们需要的信息 - 这是一个 Clojure vector,它包含两个条目,第一个条目是类库的名字, 第二个条目标识最新的稳定版本。我们打算把它添加到我们的(你之前在查看'foo' 目录的内容看到的那一个) project.clj. 打开 project.clj, 看起来就像这样:

(defproject foo "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]]) 

注意:dependencies 那段 - 这是一个包含一个条目的Clojure vector, 该条目本身也是一个包含两个条目的的 Clojure vector. 这个 vector 告诉 Leiningen 我们的项目要运行在版本是1.4.0的Clojure 上.够公平的了,现在让我们添加我们之前看到的那个clj-http vector。 现在 project.clj 看起来应该像这样:

(defproject foo "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [clj-http "0.6.3"]])

0595
0595
翻译于 2013/01/14 09:40
1
就是这样!现在我们已经指定了我们需要的clj-http类库和版本号。让我们试一下 -使用`lein repl`命令启动一个REPL,来测试我们精选的新类库。要注意的是,在REPL启动的时候Leiningen会首先下载clj-http,这是因为基本上在我们的所有操作之前,它会先在后台执行`lein deps`命令扫描 project.clj文件,并且确保已经获取到了所有我们需要的依赖类库。
好的,回到我们的REPL会话,这里有一个从clj-http的github上返回的README,它告诉我们需要在REPL上运行
(require ‘[clj-http.client :as client])

好吧我们运行一下,-这跟Python中'from clj.http import client'是一样的(与`from clj.http.client import *`截然相反,这也是'use'函数的工作)

user=> (require '[clj-http.client :as client]) nil
user=> (client/get "http://www.yelp.com") ;; a big huge blob of data pops out!


LeeGanity
LeeGanity
翻译于 2013/02/25 18:59
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(13)

刘春辉
刘春辉

引用来自“lidashuang”的评论

引用来自“mmpp33”的评论

看到这些乱七八糟的代码,就赶到恶心。。。其实c语言才是最好的语言。

肤浅
我查找关于clojure的文章,竟然在这里碰到你,缘分缘分
mahengyang
mahengyang

引用来自“吉迪恩”的评论

LISP派系有点像武侠中的日月神教和逍遥派

逍遥派+1
duyi
duyi
建立去看下Storm(最新版本),基本是用Clojure写的
赵云30
赵云30
看不出有什么特点,不是说是JAVA虚拟机上的lisp么,也不给点和Java结合的列子,这些个破程序都能干啥啊....

GDP_搞地皮
GDP_搞地皮
DrClojure — 推荐一个简单好用的Closure IDE
https://bitbucket.org/ktg/drclojure/overview
P
Paul.Joe
语言没有好坏,只有合适的
鳄鱼先生
鳄鱼先生
mmpp33这两个常识都不懂,的确是菜鸟一只。
说C是一门好语言的人肯定会惹怒一批C开发者。
说PHP是一门坏语言的人肯定会惹怒所有PHP开发者。
赵紫川
赵紫川

引用来自“赵长青”的评论

引用来自“lidashuang”的评论

引用来自“mmpp33”的评论

看到这些乱七八糟的代码,就赶到恶心。。。其实c语言才是最好的语言。

肤浅

不了解就乱说,楼上的评语很给力,提供了正能量。哈哈

哈哈,mmpp33真捉急,一看就是菜鸟。(我说的菜鸟指的不是认为C好的人,而是什么都一知半解就妄下定论。。。另外放个地图炮,说XXX是最好语言的都是菜鸟。。。
MikeManilone
MikeManilone
其實Common Lisp有SLIME+Quicklisp足矣 :-D
fromdtor
fromdtor

引用来自“lidashuang”的评论

引用来自“mmpp33”的评论

看到这些乱七八糟的代码,就赶到恶心。。。其实c语言才是最好的语言。

肤浅

不了解就乱说,楼上的评语很给力,提供了正能量。哈哈
返回顶部
顶部