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

Paul Graham氏のユーティリティ その2

| 00:47 | Paul Graham氏のユーティリティ その2 - わだばLisperになる を含むブックマーク はてなブックマーク - Paul Graham氏のユーティリティ その2 - わだばLisperになる

今日も続きでPaul Graham氏のユーティリティを読んでみることにしました。

Lisp utilities that were not included in On Lisp or ANSI Common Lisp

http://lib.store.yahoo.net/lib/paulgraham/utx.lisp

お題

bind

暗記で再現

(defmacro bind (args &body body)
  `(multiple-value-bind ,args ,@body))

いま一歩だった。

バインド部とボディを分ける必要がなかった。

名前が長いのでエイリアスのためのマクロらしい。

お題

ifnot

暗記で再現

(defun ifnot (bad var)
  (unless (eql bad var) var))

とりあえずできた。

ちょっとした便利小物といった感じ。でも、自分の思考パターンにない感じなので用途がぱっとは思い付かない。

お題

nullor

暗記で再現

(defmacro nullor (x y)
  (with-gensyms (g)
    `(let ((,g ,x))
       (if (null ,g) ,y ,g))))

間違った。

nullで判定するのではなくて、(zerop (length ,g))で判定していた。これならlist以外にも使えるということなんだろう。

(let ((hello-str (nullor str "Hello")))
     ...)

などのようにデフォルト値の設定などに使うのだろうか。

お題

until

暗記で再現

(defmacro until (test &body body)
  `(do ()
       (,test)
     ,@body))

これは定番といった感じ。

お題

caseequal

暗記で再現

(defmacro caseequal (var &body clauses)
  (let ((g (gensym)))
    `(let ((,g ,var))
       (cond ,@(mapcar (lambda (cl) 
			 `(,(if (eql (car cl) t)
				t
				`(equal ,g (car cl)))
			    ,@(cdr cl)))
		       clauses)))))

とりあえずできた。

equalで判定するcaseだから、caseequalという、memq、delq系の、動作+判定するeq系の命名法のマクロの様子。

このような命名法では、TAOのmember系の命名がなかなか素敵で、memq、memql、memquと分かりやすい。

http://www.nue.org/nue/tao-manual/tao-m.txt

SRFIだと、memq、memvといった感じ。

Common Lispでは消えてしまったけれど、Maclispでは普通に使われていた様子。Common Lispでは消えたけれど、EmacsやSchemeには受け継がれている名前というのは結構ある気がする。