ラベル Clojure の投稿を表示しています。 すべての投稿を表示
ラベル Clojure の投稿を表示しています。 すべての投稿を表示

2010年3月24日水曜日

Clojure 再帰

Clojureの再帰の書き方

(loop [result [] x 5]
  (if (zero? x)
    result
    (recur (conj result x) (dec x))))
-> [5 4 3 2 1]

loopは別にループをさせるわけではなく、[]に変数の束縛を作って、その後のS式を評価するもので、letとほぼ同じ。ただ、loopは、recurを読んだときに、loopを指定された引数で実行して、再帰を実現するようです。

Clojure マップ

Clojureには、マップというキーと値をペアとして持つコレクションがあります。
例えば、
{"x" "a" "y" "b"}
とかき、xがキーでその対応する値がa, yがキーでその対応する値がbとなります。キーと値を交互に書くわけです。

キーにはキーワード(:xxx)がよくつかわれます。
{ :first-name "Saki" :family-name "Aibu"}
みたいに。

マップは関数としても使えます。

(def girl { :first-name "Saki" :family-name "Aibu"})
(girl :first-name)
みたいに。

で、Clojureには分配束縛っていうものがあって、必要なものだけバインドすることができます。

(defn greet-author [{fname :first-name}]
  (println "Hello, " fname ))
(greet-author {:first-name "Saki" :family-name "Aibu"})
とかくと、
Hello,Saki
と表示されます。

分配束縛はマップ以外にも使えます。

(let [[x y] [1 2 3]]
  [x y])
これは、[1 2]になります。

2010年3月23日火曜日

Clojure勉強中



「プログラミングClojure」を読みはじめました。

今日はちょっとだけ、2章の真ん中あたりまで読みました。

LISPとの目立った違いは、
  • 関数の書き方が、 (defn func [arg] body)
    のように defn で定義するのと、引数が[]であること。
  • 無名関数の書き方がlamdaじゃなくてfn
  • かっこが少なくて済む
    (cond (< x 10) "less" (> x 10) "more")
    みたいに
です。(まあ、全部shibuya.lispで聞いた話ですが。。。詳細はhttp://shibuya.lisp-users.org/2010/03/21/sltt-5-mov-2/を見た方がいいと思います。。)

「初めての人のためのLISP」が読み終わったばっかりなので、
できれば、ClojureとCommon Lispと、あとSchemeとを比べたいなーっと思ってます。
(時間作ってやりたいな。。。)