#:g1: 実践SETF定義: defsetf短形式篇

Posted 2018-12-05 16:45:28 GMT

Lisp SETF Advent Calendar 2018 6日目 》

実践編今回は、defsetfの短形式篇です。ネタは刻んでいきます。

defsetfや、define-method-combinationでは、良く使いそうなものを短く書ける短形式と、詳細にパラメータを記述できる長形式がありますが、そんなに頻繁に使うわけでもないので、短形式があることで逆に混乱を招いている気がします……。

そんな短形式ですが、既存のゲッターとセッターが違う名前で存在する場合に、ゲッターの名前に統一するような場合に使えます。

具体例としては、こんな対があった場合、

(defun kar (list)
  (car list))

(defun set-kar (list val) (rplaca list val))

(let ((u (list 0 1 2))) (set-kar u 42) (list u (kar u)))((42 1 2) 42)

defsetf一発で(setf kar)に纏められます。

(defsetf kar set-kar)

しかし、セッター側の引数の順番に注意。
うまくはまるには、変数→値の順である必要があります。

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

処理系の基本関数などの定義では、結構使われているようですが、ユーザーが書くプログラムで、バラバラの名前のゲッター、セッターをsetfのもとに統一する、ということはあまりなさそうです。
長形式だけを用意しておいて、パターンが頻出する場合には、ユーザにマクロを書かせる、という方針でも良かったのでは……。

次回は、defsetfの長形式を解説してみます。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus