Clojure
文章平均质量分 64
炼气散人
等儿子高考后,或许会回来
展开
-
Clojure编程环境安装
不管是用什么开发环境,先要熟悉基本的命令行的使用方式。本文参考自官方站点:http://clojure.org/downloads首先确保已经安装了JDK5以上版本。然后下载Clojure1.4版本的release包: http://repo1.maven.org/maven2/org/clojure/clojure/1.4.0/clojure-1.4.0.zip解压后,进入clojure-1.4原创 2012-12-25 14:49:06 · 4965 阅读 · 0 评论 -
Clojure语言十二: namespace
当前namespace*ns* 指向的是当前namespace,通常是user. 不过如果在自己应用程序,比如我的my-website目录下运行lein repl,然后在运行*ns*,得到的当前namespace就不不是user,而是:my-website.server=> *ns*#创建namespace有几种方法,最简单的是用ns宏。下面创建了一个文件config.clj(ns my-web原创 2013-01-03 18:07:47 · 2931 阅读 · 0 评论 -
Clojure语言二:Literal
Literal中文可能应该是字面常量。字符串如果要表示字符串的话,应该用双引号括起来,比如"hello,world", 允许跨多行,并且可以使用Java的escape characters. 参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6nilnil相当于Java中的null,代表没有值,如果用在条原创 2012-12-27 10:13:57 · 2899 阅读 · 0 评论 -
Clojure语言一:Symbol
Symbol书写方式:1.开头不能是数字2.之后可以是文字或数字和 *, +, !, -, _, ?3./ 是特殊字符,在Symbol中只能出现一次,通常/左边是namespace。比如:my-namespace/foo。4. . 也是特殊字符,可以出现在Symbol中多次。比如:java.util.BitSet。5. : 可以用在Symbol中多次,但是不能连续6. .开头或者结尾的Symbol原创 2012-12-27 09:51:39 · 3652 阅读 · 0 评论 -
Clojure语言六:def & var
Clojure提供了一种函数和宏之外的操作形式,special form. 数量有限,并且不是Clojure语言本身实现的。主要是下面几个:catch,def, do, dot ('.'), finally, fn, if, let, loop, monitor-enter, monitor-exit, new, quote, recur, set!, throw, try 和 var.完整文档请原创 2012-12-28 09:55:43 · 4701 阅读 · 0 评论 -
Leiningen 与 maven
Leiningen是管理clojure工程的, 其实就是使用clojure管理clojure工程,project.clj是其主要配置文件,其基本原理是根据project.clj文件生成pom.xml,然后利用maven的强大功能进行项目管理。如何测试project.clj是否合理使用命令lein pom, 会根据当前目录下的project.clj文件生成pom.xml,然后通过检查pom.xml文原创 2015-11-03 22:12:35 · 3581 阅读 · 0 评论 -
Clojure语言十三: 宏的基本概念
micro与function的区别特点是允许在Clojure evaluate你的list之前,你能够像处理函数一样的处理它, 但是不evaluate。如果你想把一个表达式作为参数传递给函数,并要求这个参数不求值,这是做不到的。比如下面的函数定义会报错:user=> (def ignore-last-operand2 [function-call] (butlast function-ca原创 2015-10-18 21:49:46 · 3180 阅读 · 0 评论 -
Clojure语言十五 quote & unquote
quote(quote ...) 或者用',用来阻止list被求值比如:> (quote a)a> 'bbunquote~刚好相反,用来将quote的symbol被取消quote状态,恢复求值的功能> ~'a~@411CF0a> ~(quote a)~@411CF0aquote unquoited symbol如果用unquote定义了恢复了一个symbol的求值能力,需要将这个表原创 2015-10-27 15:45:25 · 2459 阅读 · 1 评论 -
Clojure语言十四 常用宏
常用宏infix宏解析人的四则运算书写格式并执行(defmacro infix "Use this macro when you pine for the notation of your childhood" [infixed] (list (second infixed) (first infixed) (last infixed)))这么用:(infix (1 + 1));原创 2015-10-27 10:02:06 · 2298 阅读 · 0 评论 -
clojure 1.7 安装
由于storm的普及,clojure重新回到了我的技术中,现在在ubuntu 15.04上安装clojure 1.7最新环境。下载并解压wget http://repo1.maven.org/maven2/org/clojure/clojure/1.7.0/clojure-1.7.0.zipunzip clojure-1.7.0.zip进入目录后,用下面的命令进入clojure shell, 做原创 2015-10-14 11:26:00 · 2732 阅读 · 0 评论 -
用Leiningen创建第一个Clojure工程二
在project1工程文件中添加一个clj-http依赖:(defproject project1 "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :u原创 2012-12-26 15:50:31 · 4043 阅读 · 0 评论 -
用Leiningen创建第一个Clojure工程一
本文内容来自:https://github.com/technomancy/leiningen/blob/preview/doc/TUTORIAL.md不过只描述最简单的部分,不会冗长而让人知难而退。运行下面的命令,就可创建第一个工程$ lein new project1Generating a project called project1 based on the 'default' tem原创 2012-12-25 21:02:22 · 5509 阅读 · 0 评论 -
用Leiningen创建第一个Clojure工程三
现在来看一下前面译文中碰到的代码:第一个是nil, 和Java的null值相同,和false一样可以表达条件判断不为true的情况。下面是解释:nilnil is a possible value of any data type in Clojure. nil has the same value as Java null. The Clojure conditional system is原创 2012-12-26 17:15:47 · 2976 阅读 · 0 评论 -
用Leiningen创建第一个Clojure工程四
这节介绍如何将Clojure程序打包成一个可以执行的standalone Java程序。也就是所有的依赖都已经在jar包中,并且Main-Class manifest 也被正确设置。首先修改代码core.clj:(ns project1.core (:gen-class))(defn -main "I don't do a whole lot." [& args] (printl原创 2012-12-26 18:22:59 · 3519 阅读 · 0 评论 -
Clojure语言十六 clojure与java
Clojure可以基于任何语言Clojure诞生之初,是基于Java的。但是任何语言都可以解析lisp并执行,所以Clojure可以基于任何语言,只要一个大拿愿意这么干。这不,Clojurescript基于JavaScript的已经出现了, 之后又引发了另一个项目的出现ClojureC。两个项目在github上的地址:https://github.com/clojure/clojurescript原创 2015-10-30 15:05:40 · 3950 阅读 · 1 评论 -
clojure引入另一个clojure实现的Java类
说起来有点绕口,是这么回事。core.clj文件里面要使用一个Java类,这个Java类(MoveDailyAction)是由同一个项目的clojure代码编译生成的,clojure -> java class请参考之前的博客clojure实现java类现在需要将clojure生成的Java类的class文件放在指定的目录下,然后让core.clj能够引用到这个class文件。这就主要靠leini原创 2015-11-19 00:19:46 · 2800 阅读 · 0 评论 -
用Clojure编写REST service 七 启动时读取配置文件
有了前面的namespace模块化的基础,现在重构一下代码。像一般的web 应用,启动的时候读取配置文件,然后将配置信息保存在全局变量中。以后用到就读这个变量。现在在server.clj文件中修改如下:(ns my-website.server (:require [noir.server :as server]) (:use [clojure.tools.logging :only (i原创 2013-01-03 21:45:22 · 3575 阅读 · 0 评论 -
用Clojure编写REST service 六 使用log4j
由于logback暂时不能用,所以这里先用log4j顶一下。project.clj文件如下:(defproject my-website "0.1.0" :description "example rest service" :dependencies [[org.clojure/clojure "1.4.0"]原创 2013-01-02 19:55:49 · 3049 阅读 · 0 评论 -
Emacs 配置Clojure开发环境一 clojure-mode
发现Clojure太晚了,遗憾的是我是个很不错的Java程序员,同时还擅长Emacs, 对于lisp比较熟悉。居然不知道Clojure? 错过了多少青春年华。亡羊补牢,为时未晚。现在开始吧。clojure-mode提供了基本的语法高亮和缩进,很基本,但是必不可少。首先下载clojure-mode.el文件,下载地址:https://raw.github.com/technomancy/clojur原创 2012-12-26 18:25:50 · 5962 阅读 · 4 评论 -
Clojure语言三:容器
map{:a 1 :b 2}用{ } 括起来,key都由:开头,每对key/value中间用空格分开,也可以用,分开, ,被认为等价于一个空格vector用[ ] 括起来的,比如:[1 2 3]数组中的每个元素之间用空格分开set也使用{ }括起来,但是前面多一个#符号#{:a :b :c}同时没有key,只有value,而且形如:valuelist还有一个最常见的list,( )括起来。LISP原创 2012-12-27 16:23:16 · 2712 阅读 · 0 评论 -
Clojure语言五:StructMap
参考官方文档:http://clojure.org/data_structures很多自定义的map拥有部分或者全部相同的keys,将这些相同的keys抽出来定义成StructMap类型,可以提升性能,节省内存。下面这篇中文文档写的非常好,推荐,我的例子来自于它:http://xumingming.sinaapp.com/302/clojure-functional-programming-for原创 2012-12-27 20:32:53 · 3232 阅读 · 0 评论 -
Clojure语言四:解析XML
现在假定有一个xml文件内容如下: localhost 7777 200 200 Clojure提供了clojure.xml来解析xml文件。启动REPL会话,lein repl输入下面的命令:user=> (require 'clojure.xml)niluser=> (clojure.xml/parse "/home/che原创 2012-12-27 16:31:55 · 4174 阅读 · 0 评论 -
Leiningen 安装
Leiningen是一个Clojure项目管理工具。安装过程如下:1. 下载lein脚本https://raw.github.com/technomancy/leiningen/preview/bin/lein2. 复制到/usr/bin目录下,并允许执行mv lein /usr/bin/root@chenshu-yangzhou-home:~/Downloads# chmod +x /usr/原创 2012-12-25 17:19:29 · 13311 阅读 · 0 评论 -
Clojure语言七:I/O
对应stdin, stdout和stderr, Clojure默认提供了*in*, *out*和*err* 三个symbols与之对应。可以使用binding宏进行重定向。比如下面的例子将*out* 重定向到文件中:user=> (binding [*out* (java.io.FileWriter. "/home/chenshu/tt")] (println "Write to tt.") (f原创 2012-12-28 10:50:42 · 3418 阅读 · 0 评论 -
用Clojure编写REST service 一 Noir创建web app
写一个真正的互联网应用,才可以观察Clojure的威力。本文使用Noir框架,参考官方站点:http://www.webnoir.org/执行三行命令:lein new noir my-websitecd my-websitelein run也可以在lein run命令前运行lein deps命令。国内网络下载依赖比较痛苦,还好用了proxy,试了好多次,web应用的所有java依赖才下载完成原创 2012-12-29 18:14:19 · 3934 阅读 · 0 评论 -
用Clojure编写REST service 二 Noir创建Rest API
前面一节介绍了Noir如何非常方便的创建一个web app,但是我的实际一个项目的需求中只需要REST API开发,页面部分都交给了html和Javascript,并不需要Noir在后台渲染网页。同样无需重新启动程序,在src目录下创建rest目录,里面有一个test.clj文件:$ tree.├── models├── rest│ └── test.clj├── server.cl原创 2012-12-29 20:05:52 · 3670 阅读 · 0 评论 -
Clojure语言八:Sequence
sequence定义sequence不是一般的list,实际上实现了ISeq接口,ISeq接口定义如下:package clojure.lang;/** * A persistent, functional, sequence interface * * ISeqs are immutable values, i.e. neither first(), nor rest() chang原创 2012-12-28 12:38:43 · 2855 阅读 · 0 评论 -
Clojure语言九:for循环
宏for可以支持循环下面继续前面的xml的例子,演示如何用for遍历xml-seq返回的sequence.user=> (for [x r] (println "^" x))(^ {:tag :service, :attrs nil, :content [{:tag :mongodb, :attrs nil, :content [{:tag :uri, :attrs nil, :content原创 2012-12-28 18:28:21 · 4411 阅读 · 0 评论 -
用Clojure编写REST service 三 返回JSON
前面的REST API还要继续改进,因为Ajax调用通常都需要JSON格式的响应,所以修改test.clj文件如下:(ns my-website.rest.test (:require [noir.response :as response]) (:use [noir.core :only [defpage]]))(defpage "/rest/:id" {:keys [id]} (r原创 2012-12-29 21:09:24 · 3412 阅读 · 0 评论 -
Clojure语言十一:map函数
map函数比较特别,首先看一个简单的功能:user=> (def f (fn [x] (+ 2 x)))#'user/fuser=> (map f [2 4 7])(4 6 9)先定义了一个f函数,接受一个参数,然后返回+2后的结果。map接受两个参数,第一个是f函数,第二个是一个数组。用数组中的三个元素依次调用f函数,每次调用的结果加入到一个list中并返回。map的文档:-------原创 2013-01-01 21:33:48 · 6475 阅读 · 1 评论 -
用Clojure编写REST service 四 读取配置文件
最好的配置文件写法是采用clj文件,下面先把前面的a.xml文件改成a.clj文件,内容如下:{:mongodb "localhost" :listen_port 7777 :login_timeout 200 :check_timeout 200}这里定义了一个map。注意,localhost是字符串,必须用双引号。这里用空格分开每个key/value组成的pair.在test.clj文件中添加原创 2012-12-30 21:29:18 · 3346 阅读 · 0 评论 -
Clojure语言十:fn object
(fn..)可以用来创建匿名函数,比如:user=> (fn [x] (+ 2 x))#接受一个参数x,然后加上2. 上面的调用使用fn定义了一个函数,但是并没有执行。如果要立即执行,可以加上括号和参数:user=> ((fn [x] (+ 2 x)) 5)7但是更多时候我们希望函数先定义,以后反复使用,可以结合def:user=> (def f (fn [x] (+ 2 x)))#'us原创 2013-01-01 21:05:36 · 3481 阅读 · 0 评论 -
用Clojure编写REST service 五 使用logback(有bug)
一个完整的web app当然需要写日志。这里我采用习惯的slf4j+logback。首先在my-website目录的project.clj文件中添加两个依赖:tools.logging&logback-classic(defproject my-website "0.1.0-SNAPSHOT" :description "FIXME: write this!"原创 2013-01-02 18:58:54 · 3030 阅读 · 0 评论 -
clojure实现java类
为什么需要这么干?因为clojure可以调用java的类,但有时候这些java类需要你实现一个子类或者传递一个自定义的java对象作为参数,所以需要将clojure代码编译成java代码。还记得之前提过的:gen-class么,在(ns...)中,使用(:gen-class),在(ns..)之外,应该用 (gen-class)下面是一个例子:(ns kafka2hdfs.MoveDailyActi原创 2015-11-18 18:43:50 · 3126 阅读 · 0 评论