Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-09-17

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

| 23:58 | ClojureでL-99 (P1 最後のペアを返す) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P1 最後のペアを返す) - わだばLisperになる

最近どうも鬱々として不調なのですが、なんでだろうと内省したところ、これはどうも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"