[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Lexical environment of method

I want to write an arbitrary function to be called inside the body of a method and I want the function to receive the
lexical environment of the method. The function is to be compiled and stored on an instance variable of a flavor. The
method will take an arbitrary arglist and simply forward it to the function. For example: 

(defflavor widget ((fn) (ivar "puzzle")) ())
(setq foo (make-instance 'widget :fn (compile nil '(lambda (string) (format t "~%~a ~a" string ivar)))))
;;;see what is stored on fn
(widget-fn foo) => #<dtp-compiled-function ...>
(defmethod (doit widget) (&optional &rest args)
  ;;fn knows about the lexical environment of this method
  (apply fn args))

;;;call the doit method
(doit foo "Jigsaw") =>
Jigsaw puzzle

The motivation for the above is to essentially have methods that are private to a specific instance rather than available to
an entire flavor (class).
Alternatively, I could easily create in-flavor functions and pray that no two instances used the same function name. For

(setq foo (make-instance 'widget :fn (defun-in-flavor (foo-fn widget) (string) (format t "~%~a ~a" string ivar))))
;;;see what is stored on fn
(widget-fn foo) => (defun-in-flavor foo-fn widget)

Notice that the function spec for defun-in-flavor is a list. Now how do I get the *function object* to be passed to apply??
That is,
	(apply (widget-fn foo) args) 
will not work.

	Len Charest, JPL AI Lab