Let Over Lambda(LOL)のalambda,aletあたりを読んで間接参照を定義する単純な方法を考えてみました。
(let ((set-sym (gensym))
(deref-sym (gensym)))
(defun ref (fn)
(let ((this fn))
(lambda (&rest args)
(cond
((eq (car args) set-sym)
(setf this (cadr args)))
((eq (car args) deref-sym)
this)
(T (apply this args))))))
(defun deref (ref)
(funcall ref deref-sym))
(defun (setf deref) (fn ref)
(funcall ref set-sym fn)))
;; example
(ref (lambda (a b) (+ a b)))
(setf (symbol-function 'a) *)
(a 2 3)
;;=> 5
(funcall (deref #'a) 4 5)
;;=> 9
(setf (deref #'a) (lambda () :a))
(a)
;;=> :a
0 件のコメント:
コメントを投稿