#:g1: ClojureでL-99 (P1 最後のペアを返す)

Posted 2008-09-17 14:58:00 GMT

最近どうも鬱々として不調なのですが、なんでだろうと内省したところ、これはどうもL-99をやってないからじゃないかという結論に達しました。
ということで、今日からリハビリの為に、ClojureでL-99を開始しようかと。
いい加減 問50以降も挑戦しないととは思いますが、P1からで…。
さっと眺めただけでも、Clojureには色々面白そうな特徴があるようです。これは面白そう。
(defn my-last [col]
  (if (empty? (rest col))
    col
    (my-last (rest col))))

;; 動作例 (my-last '(1 2 3 4)) ;=> (4) (my-last [1 2 3 4]) ;=> (4) (my-last "1234") ;=> (\4)

;; デフォルトだと末尾再帰の最適化はしてくれないそうなので、 ;; 用意された構文で書く必要があるらしい。 (defn my-last [col] (loop [col col] (if (empty? (rest col)) col (recur (rest col))))) ;; とか

面白いとおもったところ

cadr、cadddrに似た合成された関数名

first + rest => frest つまり、second
(frest [1 2 3 4])
(frest [1 2 3 4])
;=> 2
(rrest [1 2 3 4])
;=> (3 4)

文字列もリストみたいに扱える

(apply str (rrest "お前誰?"))
;=> "誰?"

;; repeatは無限リストを生成し、takeで最初の10個を ;; 取得、つまり遅延リスト (apply str \う \は (take 10 (repeat \w))) ;=> "うはwwwwwwwwww"

comments powered by Disqus