Clojureでプログラムを組んでいるうちに、forマクロが強力だということにやっと気づいたので、リファレンスを書いてみる。 forマクロとは 普通の(というか、CやJava系列の)言語では、forはループ文を表すが、Clojureではforマクロはループではなく、シーケンスを作るオペレータだ。 下記のコードでは、0〜9までの数をそれぞれ2倍した数のシーケンス(0, 2, 4, ..., 18)を返す。 (for [x (range 10)] (* x 2)) しかも、返されるシーケンスは遅延シーケンスなので、この式が評価されたときに中身が評価されるのではなく、シーケンスの中身が評価された時に評価される。 => (let [x (for [x (range 3)] (do (println "x=" x) (* x 2)))] (prn "hoge") (prn x)) "hoge" (x
clojure.core.logicというClojureをProlog化するライブラリがある。 Prologとは、論理型プログラミング言語。 下記のサイトで詳しい説明をしている方がいらっしゃるので、論理型言語についての説明は省略。 http://www.geocities.jp/m_hiroi/prolog/ このPrologのようなことが、論理型言語ではなく関数型言語のClojureで、ライブラリ clojure.core.logic をロードするだけでできてしまう。 https://github.com/clojure/core.logic The Reasoned Schemer という本は、Schemeで論理型プログラミングを実現する内容だが、 clojure.core.logic はこの本の内容をClojureに移植したもの。 The Reasoned Schemer 作者: D
前記事と似たような話。 プログラミングHaskellの第8章で紹介されているパーサコンビネータと同じようなことができるfnparseというライブラリがClojureにも存在する。パーサコンビネータと言えばScalaのライブラリ(コップ本*1 31章)にもあるが、どれも似たような感じのものだ。 プログラミングHaskell 作者: Graham Hutton,山本和彦出版社/メーカー: オーム社発売日: 2009/11/11メディア: 単行本(ソフトカバー)購入: 14人 クリック: 503回この商品を含むブログ (115件) を見る Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala) 作者: Martin Odersky,Lex Spoon、Bill Venners,羽生田栄一,長尾高弘出版社/メーカー: インプレスジャパン発売日
以前こんな記事を書きましたが、ライブラリ探索していて new-by-name という関数を見付けました。これを使えば次のように apply + new が実現できます。 (use '[clojure.contrib.core :only (new-by-name)]) (use '[clojure.contrib.str-utils :only (re-split)]) (->> "2010-05-20 10:32:44" (re-split #"\D+") (map #(Integer/parseInt %)) (apply new-by-name "java.util.GregorianCalendar")) new-by-name はクラス名からクラスのインスタンスを生成する「関数」です。関数ですので new のように悩むことなく、普通に apply ができます。 文字列で指定すると
複数引数のコンストラクタにシーケンスをわたす。 最初こんなコードを書いてエラーになった。 (apply java.util.GregorianCalendar. [2010 5 20]) ;;=> java.lang.ClassNotFoundException: java.util.GregorianCalendar... 「new class名」の構文糖「class名.」は、applyに渡せないらしい。 (apply new java.util.GregorianCalendar [2010 5 20]) ;;=> java.lang.Exception: Unable to resolve symbol: new in this context ... これも駄目。new は関数じゃないから apply できない。 ラムダ式で包めばいい? (apply #(java.util.Gre
Tokyo.clj #2で、最近出たClojure 1.2でProtocolという仕組みが追加されたと聞いた。解説ビデオによると、マルチメソッドと似たようなことを、オーバーヘッド少なく実行するものらしい。 とりあえず試す。Clojure 1.2は、masa_edwさんの解説の方法で使う。 まずdefprotocolでProtocolを定義。SujiMojiというProtocolの中で、2引数を取る関数tasuと、1引数を取る関数nibaiを定義してみる。Javaのinterfaceと同じで、実装を含まない。 (defprotocol SujiMoji (tasu [a b]) (nibai [a]) ) でProtocolに対する実装。いくつかの方法があるようだけど、extend-protocolを使って、第1引数の型で処理を分けてみる。 (extend-protocol SujiMoji
Clojure | 18:34 | Clojureのマルチメソッドを使っていると、自分で定義した型でディスパッチしたいと思うことがある。しかしdefstructを使ってもうまくいかない。 user> (defstruct Foo :a :b) #'user/Foo user> (struct Foo 1 2) {:a 1, :b 2} user> (class *1) clojure.lang.PersistentStructMap user> (defmulti my-println class) #'user/my-println user> (defmethod my-println Foo [foo] (println "foo")) # user> (my-println (struct Foo 1 2)) ;=> error ; Evaluation aborted. defs
So your Clojure app wants to write logfiles. It’s easier than it used to be, thanks to Malcom Sparks and his clj-logging-config project. All the messy and utterly static log4j.properties stuff has been wrapped up in a nice dynamic Lisp layer! Here’s how. First, set up your project.clj file to load the appropriate libraries: (defproject my-project "1.0.0-SNAPSHOT" :description "My Project" :depende
Leiningenの調べ物をしていてgithubのリポジトリを見ていたらzshの補完関数があったので使ってみました. 導入方法 概要はzsh_completion.zshのコメント欄に書いてあります. zshの$fpathの通ったディレクトリにzsh_completion.zshという名前のファイルをダウンロードして,そのファイルの名前を_leinに変更すれば利用できます. $ cd /Users/yag_ays/.zsh/functions/Completion $ curl -O https://raw.github.com/technomancy/leiningen/master/zsh_completion.zsh $ mv zsh_completion.zsh _lein 使い方 lein [TAB]とすればコマンド一覧が表示されます.また,lein test [TAB]とすれば
The remaining six Clojure/conj 2011 videos have been released, and all videos are now available on Clojure's blip.tv page. Thank you once more to all of our speakers and attendees. If we don't see you at Clojure/west or EuroClojure first, we'll see you at the next Conj! Scheduled Talk Videos Keynote Rich Hickey Video on blip.tv Cascalog: Making Data Processing Fun Again Nathan Marz Video on blip.t
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く