2009/12/02

[Common Lisp] sif

Common Lisp のアナホリックマクロといえば、aif が有名だが、 Anaphora には it に setf できる sif や swhen がある。 gethash と一緒に使うと便利だったりする。

(eval-when (:compile-toplevel :load-toplevel :execute)
(require :anaphora)
(use-package :anaphora))

(defparameter *hash* (make-hash-table))

(sif (gethash :key1 *hash*)
(list 'ok it)
(list 'new (setf it 'value)))

ちなみに C-c M-m (slime-macroexpand-all)してみると↓のようになった。

(SYMBOL-MACROLET ((#:THIS-S971
(ANAPHORA::INTERNAL-SYMBOL-MACROLET ((IT #:THIS-S969))
(GETHASH :KEY1 *HASH*)))
(IT #:THIS-S971))
(IF (SYMBOL-MACROLET ((IT #:THIS-S969))
(GETHASH :KEY1 *HASH*))
(LIST 'OK
(SYMBOL-MACROLET ((IT #:THIS-S969))
(GETHASH :KEY1 *HASH*)))
(LIST 'NEW
(LET* ((#:G972 :KEY1) (#:G973 *HASH*))
(MULTIPLE-VALUE-BIND (#:G976)
'VALUE
(SYMBOL-MACROLET ((IT #:THIS-S969))
(LET* ((#:G981 #:G972) (#:G982 #:G973))
(MULTIPLE-VALUE-BIND (#:G984)
#:G976
(SB-KERNEL:%PUTHASH #:G981 #:G982 #:G984)))
#:G976))))))

symbol-macrolet を使ってること以外は、よく分からんw

さらに asif なんてものもある。 then では setf できないが、else では setf できるらしい。

0 件のコメント: