#:g1: 実践SETF定義:マクロを定義した場合のおまけsetf

Posted 2018-12-13 18:45:56 GMT

Lisp SETF Advent Calendar 2018 14日目 》

setf系構文の紹介ですが、今回は、Macro Forms as Placesの紹介です。
Macro Forms as Placesというと何のことだかさっぱりという感じですが、単にマクロを定義したらsetf定義もオマケで付いてきちゃった、という感じのものです。

例を挙げると、

(defmacro kar (x)
  `(car ,x))

(kar (list 0 1 2)) → 0

という定義があった場合、setfの定義は何もしていませんが、下記のようなものが動きます。

(let ((list (list 0 1 2)))
  (setf (kar list) 42)
  list)(42 1 2) 

ローカルマクロでも可

(macrolet ((qar (x)
             `(car ,x)))
  (let ((list (list 0 1 2)))
    (setf (qar list) '())
    (push 42 (qar list))
    list))((42) 1 2) 

setf場所にマクロで定義したフォームで使えるというのがMacro Forms as Placesです。

Macro Forms as Placesを利用する場合の注意点ですが、マクロ展開後のフォームが、setfで解釈できる状態になっていなければなりません。

具体例を挙げると、prognには、標準ではsetf定義がないので、最外周にprognが現われるような書き方をすればエラーになります。

;; OK

(defmacro kar (x)
  `(car ,x))

;;; NG (defmacro kar (x) `(progn (car ,x)))

まとめ

うまくはまれば、便利に使えるMacro Forms as Places。 活用してみては如何でしょうか。

類似の過去記事


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus