[Openmcl-devel] dfsl/foreign function oddities
Gary Byers
gb at clozure.com
Sat May 14 15:28:27 PDT 2005
On Sat, 14 May 2005, Chris Curtis wrote:
> On May 13, 2005, at 8:04 PM, Gary Byers wrote:
>
>> I can't think of a clean solution to the problem when #_ is involved.
>
> With a little more thought and some testing.... is it clean enough to just
> wrap a defmacro that uses the reader macros in (eval-when :compile-toplevel
> :load-toplevel ...)?
>
> --chris
>
I don't think so; regardless of what EVAL-WHEN situtations are involved,
the reader will only read the form (and call the #_ reader macro) once.
You could do something like:
;;; file containing macro definitions
(eval-when (:compile-toplevel :load-toplevel :execute)
;; Ensure that #_/#$ reader macros are in effect, so
;; that the OS-package symbols involved have correct
;; definitions and so #_/#$ can be used in macroexpansions.
(read-from-string "#_foo")
(read-from-string "#$bar"))
(defmacro ...)
(defmacro ...)
;;;; eof
About the only way that I can think of to make it a little less
ugly is to expose some of the stuff that the reader macros use,
e.g.:
(eval-when (:compile-toplevel :load-toplevel :execute)
;; Ensure that #_/#$ reader macros are in effect, so
;; that the OS-package symbols involved have correct
;; definitions and so #_/#$ can be used in macroexpansions.
(ensure-foreign-function-definition-from-interface-db "foo")
(ensure-foreign-constant-definition-from-interface-db "bar"))
assuming that those ENSURE-FOREIGN-...-DEFINITION-... functions
existed. (They obviously sort of do - under different names -
but they're probably a little too tied to the reader macros
implementations )
The user would -still- need to be aware of this issue - "in order to
reliably use #_/#$/#? in macroexpansions, one has to ensure that the
foreign constant/function/variable definitions are in effect at
macroexpand time." The proposed ENSURE-FOREIGN-* functions are
arguably a less obscure way of doing that than calling READ-FROM-STRING.
Yet another approach:
(defmacro ensure-foreign-constant-definition-from-interface-db (string)
`(eval-when (:compile-toplevel :load-toplevel :execute)
(read-from-string ,(concatenate 'string "#$" string))))
More information about the Openmcl-devel
mailing list