SETF関数を取り出す - lisp-cookbook-ja/common-lisp GitHub Wiki

関数

setfは汎変数を扱い、読み出されてくる場所(読み出す関数)に応じて関数を設定することが可能です。

通常関数は、関数名のシンボルに束縛されていますので、symbol-functionにて関数オブジェクトを取り出すことが可能ですが、対象は名前の通りシンボルのみですので、setfの場合は、fdefinitionを利用します。

fdefinitionは、シンボルも取り扱うことが可能です。

(setf (fdefinition 'set-car)
      (fdefinition '(setf car)))

(let ((list (list 1 2 3 4)))
  (set-car 'foo list)
  list)

;=> (FOO 2 3 4)

また、(function (setf 名前))もしくは#'(setf 名前)という形で直接利用することも可能です。

(let ((list (list 1 2 3 4)))
  (funcall #'(setf car) 'foo list)
  list)

;=> (FOO 2 3 4)

議論