[Openmcl-devel] New snapshots available
alms at clozure.com
Sat Feb 17 15:26:48 EST 2007
Gary Byers wrote:
> (a) by having their components returned as multiple values:
> (multiple-value-bind (frame-width frame-height)
> (ns:size (make-instance 'ns:ns-attributed-string :with-string "testing")))
> One advantage of this convention is that one could use things like
> NTH-VALUE if you're only interested in (for instance) the height
> of a string, and passing multiple-values around is (fairly cheap.
> A disadvantage is that it's not clear if this approach (viewing
> a structure as its individual components) should be extended to
> cases where the "value(s)" of that structure is needed:
> (ns:do-something-with-size! foo frame-width frame-height)
> (ns:init-with-frame! view x y width height)
> And, in the case where a message (generic function) has some methods
> which involve structure arguments and some which don't, it would lead
> to a case where the "generic function" took different numbers of required
> arguments according to the class of the specialized argument/receiver,
> as well as the case where something like NS:SIZE returned different numbers
> of values according to the class of the receiver. Both of those
> situations seem undesirable - to me, not quite undesirable enough
> to kill the idea, but certainly undesirable.
This solution seems to cause more problems than it addresses.
> (b) As Lisp objects (DEFSTRUCTs, something lower-level, CLOS
> instances.) This is arguably even "lispier", but has some runtime
> costs (memory-allocation and GC) that are hard to avoid. I think
> that Randall had some code for coercing between foreign structures
> and lisp objects working, and there are probably ways of avoiding
> some incidental consing in some cases.
> This would lead to:
> (let* ((frame-size (ns:size (make-instance 'ns:ns-attributed-string ...))))
> (format t "~&Size of string is [~S ~S]"
> (ns:nsize-width frame-size)
> (ns:ns-size-height frame-size)))
> (let* ((frame (ns:make-rect x y width height)))
> (ns:init-with-frame& view frame))
> Depending on exactly what an NS:RECT lisp object looked like, it might
> be possible to productively stick a (DECLARE (DYNAMIC-EXTENT FRAME))
> in there.
How about adding a macro that binds the components of a structure to variables? It should be pretty easy  for the compiler to recognize cases where it can actually allocating the object:
(with-structure-components (frame-width frame-height)
(ns:size (make-instance 'ns:ns-attributed-string :with-string "testing"))
But then if you actually want the structure, you can get it:
(let* ((frame (ns:make-rect x y width height)))
(ns:init-with-frame& view frame))
 easy for me to say, at least, since I'm not writing the compiler.
More information about the Openmcl-devel