とりあえず、Clojureを触ってみた感想ではある。
;; 定義 (define hello (lambda (name) (string-append "hello, " name))) ;; or (define (hello2 name) (string-append "hello, " name))
;; 定義 (def hello (fn [name] (str "hello, " name))) ;; or (defn hello2 [name] (str "hello, " name))特に何も書く必要はないだろうというくらいよく似ている。[]は引数だけど、ベクターのリードマクロでもある。
うわさによると
defn
は構文ではなくマクロだそうだ。 あと、defnはデフォルトでSchemeでいうcase-lambda仕様になっている。
;; 名前付let (define (factorial n) (let loop ((cnt n) (acc 1)) (if (zero? cnt) acc (loop (- cnt 1) (* acc cnt)))))
;; 名前付let ;; なんてものはないのでloopとrecurを使う (defn factorial [n] (loop [cnt n acc 1] (if (zero? cnt) acc (recur (dec cnt) (* acc cnt)))))loop構文は多分letのバインド方式だと思う。Clojureではletは括弧が一つでよくて、順に変数名、初期値、以下続くという感じになる。Schemeに慣れているとちょっと混乱しそうになる。
とりあえずこれくらいにしてしまう。本家サイトにドキュメントあるので、興味があればどうぞ。
追記:Syntax Highligterを試してみた。即興でScheme版をClojure版からつけてみたが、割といい感じだ。
No comments:
Post a Comment