とりあえず、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