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-14

アナフォリックDEFUNでバグに勝つる!

| 23:09 | アナフォリックDEFUNでバグに勝つる! - わだばLisperになる を含むブックマーク はてなブックマーク - アナフォリックDEFUNでバグに勝つる! - わだばLisperになる

再帰している関数を、foo-bar-1、foo-bar-2、foo-bar-3などど、試行錯誤しつつ作成していて、良く遭遇しがちなミスに、名前の付け替え忘れというのがあるかと思います。

foo-bar-1のコードをコピペし、バグを直したつもりでfoo-bar-2を実行してみると、全然バグは直っておらず、なんでなんだ!と散々悩んで良く見てみると、foo-bar-2の中ではfoo-bar-1が呼ばれていた、などというものです。

こんな名前の付け替え漏れの間違いも自身をSELFで呼び出すようにしておけば発生しないのではないか?、ということで、ALAMBDAのようなADEFUNを作ってみました。

(DEFMACRO ADEFUN (NAME ARGS &BODY BODY)
  `(DEFUN ,NAME (,@ARGS)
     (MACROLET ((SELF (,@ARGS) `(,',NAME ,,@ARGS)))
       ,@BODY)))

使用例

(ADEFUN FIND-TREE3 (SYM TREE)
  (ACOND2 ((OR (NULL TREE) (ATOM TREE))
           (VALUES NIL NIL))
          
          ((EQL SYM (CAR TREE))
           (VALUES (CDR TREE) 'T))

          ((SELF SYM (CAR TREE))
           (VALUES IT 'T))

          ((SELF SYM (CDR TREE))
           (VALUES IT 'T))

          ('T (VALUES NIL NIL))))

;; FIB
(ADEFUN FIB (N)
  (IF (< N 2)
      1
      (+ (SELF (1- N))
         (SELF (- N 2)))))

FLETで良いと思いますが、なんとなくでMACROLETで自身のエイリアス名を定義しています。

ゲスト



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