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

KMRCLを眺める (33) MKLIST

| 23:44 | KMRCLを眺める (33) MKLIST - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (33) MKLIST - わだばLisperになる

前回でKMRCLのmacros.lispの中は全部眺めました。

このままKRMCL全部を眺めるのも如何なものか、と思ったのですが、暇なので全部眺めてみようと思います。

ということで、lists.lispに突入です。一ヶ月位リスト関係のユーティリティが続きます。

今回は、そのlists.lisp.の中からMKLISTです。

(defun mklist (obj)
  "Make into list if atom"
  (if (listp obj) obj (list obj)))

定義をみれば動作は、すぐ分かると思いますが、

引数がアトムの時には、listで包み、そうでなければ、渡された引数を返すというものです。

(MKLIST :FOO)
;⇒ (:FOO)

(MKLIST '(:FOO))
;⇒ (:FOO)

しかし、この動きにMKLISTという名前は自分なら付けないなあと思いつつ、しかし、どっかで見た記憶があるなと、Google Code Searchで検索してみたところ、PAIPの中に出てきたユーティリティでした。

今回のMKLISTのような関数を眺めていて思うのですが、こういう引数をそのまま返すことがある関数は、破壊的ではないものの、返って来た値に破壊的変更を加えると元のリストを破壊することになるので、そういうことをするときには注意です。

例えば、

(LET ((FOO (LIST :FOO :BAR :BAZ)))
  (NRECONC (MKLIST FOO) (LIST :QUUX))
  FOO)
;⇒ (:FOO :QUUX) ;(:FOO :BAR :BAZ)を期待(多分)

こういう場合に、あれれ?ということになるやもしれません。

ちなみにANSI CL標準の関数にも割とこういう、引数とEQなリストを返しても良い(と仕様で決まっている)関数が転がっていますので暇なときには探してみましょう!