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 |

2009-12-13

CL365からLISP365にイベント名変更しました

| 22:08 | CL365からLISP365にイベント名変更しました - わだばLisperになる を含むブックマーク はてなブックマーク - CL365からLISP365にイベント名変更しました - わだばLisperになる

Ruby Advent Calendar jpが羨しかったので、CL365という年中CLネタを書くというイベントを作ったのですが、CL限定というのが狭すぎたみたいなので、LISP全般にしました。

心の言語が、Common Lisp、Scheme、Dylan、Goo、Clojure等々の方々どうぞ心の言語ネタでご参加ください!

Advent Calendarのように役立つTipsでなくてもOKです。

このRSSを購読すれば毎日CLの記事が読める!これで勝つる!というのを目指しています。

ちなみに、1日先着1名でなくても複数名のエントリーOKな方針です。

KMRCLを眺める (38) FIND-TREE

| 18:58 | KMRCLを眺める (38) FIND-TREE - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (38) FIND-TREE - わだばLisperになる

今回は、KMRCLのlists.lisp中からFIND-TREEです。

名前からして、FINDのツリー版という感じですが、結果としてアイテムではなく、CDRを返すのがなんらかのミソのようです。MEMBER的?

定義は

(defun find-tree (sym tree)
  "Finds an atom as a car in tree and returns cdr tree at that positions"
  (if (or (null tree) (atom tree))
      nil
    (if (eql sym (car tree))
        (cdr tree)
      (aif (find-tree sym (car tree))
          it
        (aif (find-tree sym (cdr tree))
            it
            nil)))))

で、

動作は、

(DEFVAR *TREE* '(1 A 2 B 3 C 4 D () () (5 E 6 F 7 G (8 9 10) 11 12) 13))

(FIND-TREE 'FOO *TREE*)
;⇒ NIL

(FIND-TREE 1 *TREE*)
;⇒ (A 2 B 3 C 4 D NIL NIL (5 E 6 F 7 G (8 9 10) 11 12) 13)

(FIND-TREE () *TREE*)
;⇒ (NIL (5 E 6 F 7 G (8 9 10) 11 12) 13)

(FIND-TREE 5 *TREE*)
;⇒ (E 6 F 7 G (8 9 10) 11 12)

(FIND-TREE 'G *TREE*)
;⇒ ((8 9 10) 11 12)

しかし、

(FIND-TREE 10 *TREE*)
;⇒ NIL

(FIND-TREE 12 *TREE*)
;⇒ NIL

を見るように、真偽値のNILなのか、()が返ってきてるのか分からない問題があるようです。

ということで、GETHASHのように多値で成功/失敗を返すバージョンを作成してみました。

試しに、ACOND2を使ってみています。

(DEFUN FIND-TREE2 (SYM TREE)
  (ACOND2 ((OR (NULL TREE) (ATOM TREE))
           (VALUES NIL NIL))

          ((EQL SYM (CAR TREE))
           (VALUES (CDR TREE) 'T))

          ((FIND-TREE2 SYM (CAR TREE))
           (VALUES IT 'T))

          ((FIND-TREE2 SYM (CDR TREE))
           (VALUES IT 'T))

          ('T (VALUES NIL NIL))))
(FIND-TREE2 'G *TREE*)
;⇒ ((8 9 10) 11 12)
;   T

(FIND-TREE2 12 *TREE*)
;⇒ NIL
;   T

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20091213