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-03-24

CLOSでL-99 (P15 各要素を任意の回数複製する)

| 12:21 | CLOSでL-99 (P15 各要素を任意の回数複製する) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P15 各要素を任意の回数複製する) - わだばLisperになる

car、cdrではなくて、destructuring-bindを積極的に使ってみる。

&optionalを上手く使えば、パターンの不整合によるエラーも回避できる様子。

今回の例では、destructuring-bindが()を受けることはないので、(&optional head ...)のようなエラー回避はしていません。

(repli '(a b c) 3)
;=> (A A A B B B C C C)

(defgeneric REPLI (lst n-times)
  (:documentation "P15 (**) Replicate the elements of a list a given number of times."))

(defmethod REPLI ((lst null) n-times)
  () )

(defmethod REPLI ((lst cons) n-times)
  (destructuring-bind (head &rest tail) lst
    `(,@(make-list n-times :initial-element head) ,@(REPLI tail n-times))))