まくろちゃれんじ!setf編(第五話半)

前回のコードはletが二重になっている。これは私には少し変だなーと感じられた。だってさ、letでしたいことって局所変数を定義することだけでしょ?ならlet直下にletがあることには意味はない。一つのletで済むはずだから。


ならやってみろ、おうやってみようじゃないか、というノリで改造計画を立てて、5分くらいで僅かな改造版が出来ました。
二つのletの引数をappendによって一つリストに結合させたらこうなりました。
↓改造前

(defmacro my-setf (place obj)
  (multiple-value-bind (vars argvs val setter accessor)
      (get-setf-method place)
    `(let ,(mapcar #'list vars argvs)
       (let ((,@val ,obj))
	 ,setter))))

↓改造後

(defmacro my-setf (place obj)
  (multiple-value-bind (vars argvs val setter accessor)
      (get-setf-method place)
    `(let ,(append (mapcar #'list vars argvs)
		   `((,@val ,obj)))
       ,setter)))

結局カッコの厚さは同じになっているので、どっちの方が良いというわけでもない。むしろ改造版の方が見栄えが悪いという可能性もあるので、「改造」という言葉を使っています。


眠い。ねようかなあ。