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 |

2007-11-23

CLOSチュートリアル (2)

| 20:45 | CLOSチュートリアル (2) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSチュートリアル (2) - わだばLisperになる

Common Lisp クックブックさんのところのCLOSのチュートリアルで新しい練習問題を見付けたので挑戦!。

問題

CLOSチュートリアル 3.5. スロットより

  • defstruct マクロの実装を探し、CLOSのスロットオプションを一つ以上追加しなさい。

解答

SBCLのマクロを追い掛けてみましたが、どうも既存のマクロに追加するというのはちょっと難しそうなので、defstructをラッピングするdefstruct-plusというマクロを定義してみることにしました。

追加したスロットは、一番簡単そうなところで、:accessorと、:readerの2つです。

ymbol

適当に建増しを繰り返していたらどうにも収集がついてない長ったらしいものになってしまいました。

(defstruct-plus foo
  (x 10 :accessor access-foo-x)
  (y 20 :reader reader-foo-y-ro))

(PROG1 (DEFSTRUCT FOO (X 10) (Y 20 :READ-ONLY 'T))
  (PROGN
   (DEFUN ACCESS-FOO-X (OBJ) (FOO-X OBJ))
   (DEFINE-SETF-EXPANDER ACCESS-FOO-X (OBJ)
     (GET-SETF-EXPANSION `(FOO-X ,OBJ))))
  (DEFUN READER-FOO-Y-RO (OBJ) (FOO-Y OBJ)))

のように展開され、普通のdefstructの定義に加えてaccessorかreaderで指定した名前の関数をエイリアスとして作っているような感じです。