2010年11月26日金曜日

LOLを参考に間接参照

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 件のコメント:

コメントを投稿