(この記事はClojure Contrib Library Advent Calendar 2013の11日目の記事です) 概要core.unifyは「単一化」をClojureで扱うためのライブラリです。作者は『Joy of Clojure』の著者の一人、Fogusさんです。 単一化はPrologなど論理プログラミングなどで使われる処理で、与えられた条件から未知の値を推論する仕組みです。単一化自体について詳しく説明するのは私には難しいので、詳しくはWikipedia等で調べて下さい;−) ユニフィケーション - Wikipedia 抽象度が高いライブラリなので利点が分かりにくいですが、同じくFogusさんの作ったcore.constractsで使われているそうです。 fogus: Using unification to write readable Clojure macros? Clo
(deftype Bag [state] Object (toString [bag] (str "Bag???" state))) I want the toString to look something like clojure.core=> (def b (Bag. {:apples 1 :bannanas 4})) #'clojure.core/b clojure.core=> (str b) "BAG: {:apples 1 :bannanas 4}" What is a nice clojurey way of representing that information? Is "Bag/{:k :v}" better? How does the community do you call your toStrings?
教科書: Clojure in Action 作者: Amit Rathore出版社/メーカー: Manning Pubns Co発売日: 2011/11/28メディア: ペーパーバック クリック: 24回この商品を含むブログ (2件) を見る マクロ ? Clojureランタイムの動き ソースコード ------> [Read] -------> [Evaluate]まず、リーダーがソースコードをClojureのデータ構造に変換してから、評価されてプログラムが実行される。 マクロは評価される前のデータ構造上で振る舞いを定義することができる関数で、評価される前にプログラムからコードを操作することができる。 ソースコード ------> [Read] --- <macro> ---> [Evaluate] これができると、Clojureに新しい機能を追加することができたりするということ。 u
Clojure の型ヒント (type hinting) とプリミティブヒント (primitive hinting) との違いを整理し,これら 2 つを同時に扱うヒントを紹介します. Clojure では Java メソッド呼び出しの際にパラメータに対して型ヒントをつけることができます.そして,メソッドのレシーバに型ヒントをつけたり,オーバーロードされたメソッドの引数に型ヒントをつけたりすることで,コンパイル時に実装を決定でき実行時のリフクレクションを避けることができます.これは,Clojure で Java と同等の実行速度を得るために必須の作業になります. たとえば,Long/getType は, getType(char ch)getType(int codePoint)の 2 つのシグニチャをもつので,型ヒント無しではコンパイル時に実装を決定できません. user=> (defn
instaparseとは 今、Clojure使いの間では大きな話題となっている、パーサ(構文解析プログラム)作成用ライブラリです。 正規表現を使うのと同じくらい簡単にパーサが作成できるとのことです。 Clojure作者である、Rich Hickeyも大興奮(ソース:twitter)らしいです。 では簡単にinstaparseの特徴を解説します。 githubに機能一覧があるのですが、そこから代表的ないくつかの特徴を抜粋。 入力として文字列を受け取り、EBNF記法を用いて構文解析ツリーを生成する 出力フォーマットは、Clojureで人気の形式(hiccupとenlive)の両方をサポート 解析エラーの詳細なレポートを出してくれる 文字列をEBNF記法でうけとってパーサが簡単に書けるというみたいです。 Githubのチュートリアルを参考に、instaparseを動かしてみましょう。 環境構築方
Clojure すごい Haskell たのしく学ぼう! (3) 関数の構文 に続く第4回, “Higher order functions” の章です. 第5章 高階関数高階関数を扱えるのは Haskell でも Clojure でも同じですが, 関数がカリー化されているのは Haskell だけです. 5.1 カリー化関数-- Haskell ghci> max 4 5 5 ghci> (max 4) 5 5 Haskell では関数がカリー化されています. ;;; Clojure user> (max 4 5) 5 user> ((partial max 4) 5) 5 Clojure の関数はカリー化されていないので, 部分適用の際には partial を使います. partial はよく使う割には名前が長いので, 短い部分適用の場合には,partial せずに, #( ... )
スレッドマクロを整理する スレッドマクロって?スレッドマクロ(threading macro)は、Clojureのソースを人間に読みやすい形で書けるマクロで、現在のClojure 1.5.1には、結構な数のが用意されています。1.5で初めて追加されたものもありますし、まとめておくと、今後Clojureを始める人にも役立つかもしれないなあってことで、ブログ記事に書いておくことにしました。1.5で導入された新しいスレッドマクロも含めて既に知っている人には役に立たないのであしからず。 「スレッド」マクロといっても、並列プログラミングのスレッドとはまったく関係がないです。Clojureの -> や ->> のような、矢印系マクロの総称として使われています。Clojure 1.5.1では、次のスレッドマクロがあります。 ->->>as->some->some->>cond->cond->>基本は -
stm.md Clojure ref, atom, agent の要約 ref (協調的, 同期的) atom (非協調的, 同期的) agent (非同期的) ref (協調的, 同期的) 作成: ref 参照: deref または @ 変更: dosync で包んで ref-set: 上書き alter: 関数を適用して再代入(順序を保証) commute: 関数を適用して再代入(順序保証なし) 作成 (def x (ref '(1 2 3))) 参照 (deref x) ; -> (1 2 3) @x ; -> (1 2 3) 変更/上書き ref の変更は dosync で包むことで, 複数の変更のアトミシティが保証されるが, 単独の変更の場合でも, dosync で包む必要がある. (ref-set x '(2 3 4)) ; -> java.lang.IllegalStateE
はじめに leiningenは非常に便利なツールですが,不満点の一つとして起動等が大変遅いということが挙げられます. そこで先日lein run高速化のために色々試した結果を載せます. (なお,本記事は自分のgithub.ioに置いてた記事の転載です) 参考 https://github.com/technomancy/leiningen/wiki/Faster https://github.com/technomancy/grenchman http://maaoo.hatenadiary.com/entry/2013/12/18/013029 何故遅いのか? そもそも何故lein runが遅いのかですが,原因は以下の2つの模様です. leiningen自身の起動が遅い lein run時にバイトコード最適化が入るのだが,それが意外と時間が掛かる grenchmanのインストール gre
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く