soukouki’s diary

誰かの役に立てたらいいな。

少しclojureに触れてみた感想

ringとか使ってました。

感想は「始めやすいlisp」という感じでした。

同じことをrubyschemeclojure(末尾再帰最適化なし・あり)で書いてみました(短いのであまり参考にはならないかもしれませんが・・・)


def power(a, b)
    power_i(a, a, b)
end

def power_i(result, a, b)
    if b <= 1
        result
    else
        power_i(result*a, a, b-1)
    end
end

# power(2, 4) => 16
# power(1, 10000) => SystemStackError: stack level too deep

2**4でいいじゃん

(define (power a b) (power-i a a b))

(define (power-i result a b)
    (if (<= b 1) result (power-i (* result a) a (- b 1))))

; (power 2 4) => 16
; (power 1 10000) => 1

初心者にはなんかややこしそうに見えます。

; シンボルをチェックするので依存するやつを先に書く
(defn power-i [result a b]
    (if (<= b 1) result (power-i (* result a) a (- b 1))))

(defn power [a b]
    (power-i a a b))

; (power 2 4) => 16
; (power 1 10000) => StackOverflowError   clojure.lang.Numbers.minus (Numbers.java:136)

; 末尾再帰最適化バージョン

(defn power-m [a b]
    (loop [result 1, b b]
        (if (<= b 0) result (recur (* result a) (- b 1)))))

; (power-m 2 4) => 16
; (power-m 1 10000) => 1

括弧の種類が複数あって初心者に優しいです。でも括弧の種類を変えるだけならschemeにもできる

今回のだとわからないですが、書き方によればリストなんて意識せずに書けます。


clojureファンの言い分

ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32] Gauche scheme shell, version 0.9.4 [utf-8,wthreads], i686-pc-mingw32 Leiningen 2.7.1 on Java 1.8.0_111 Java HotSpot(TM) 64-Bit Server VM

文章の仕上がり微妙だな・・・


追記(2017-02-11)

rubydef power(a, b)

scheme(define (power a b)

clojure(defn power [a b]

括弧の囲い方がrubyとかに近いからかな?