[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
circular structures and bin files
Date: 22 Dec 87 14:08:50 EST
From: Timothy Daly <DALY@ibm.com>
Symbolics cannot handle the following in a compile-file.
(defun foo () '#1=(#1#))
This will fail complaining that bin files cannot handle
circular objects. We create circular objects all over the
place in our data structures and need to write them out.
Symbolics customer service recommends that we un-circularize
the objects first. Ha.
Does anyone have a fix for this behavior?
I'm not claiming any of these "fixes" are pretty, and certainly none are
ideal, or even convenient:
(a)
(defvar *foo* (read-from-string "#1=(#1#)")) ;; or (defvar *foo* (eval (read-from-string "'#1=(#1#)")))
(defun foo () *foo*)
(b)
(defvar *foo* (scl::circular-list)) ;; or whatever form is necessary to
;; make your circular data structure.
(defun foo () *foo*)
;; (but I assume that suggestion (b) is what customer-service
;; recommended, which you find unacceptable.)
(c)
Or define your own set of 2 dispatching macros. #n@, and #n! (for example). The
behavior of #n@ could be identical to #n#, #n! to #n=, with the
exception that they aren't resolved until load-time. The macro has
to insert the function-call to fix them up inside of a #, .
In other words, "just" automatically do what you must manually do in
alternative (b).
Alternative (c) is probably the most attractive, unless there is some
reason that the circular structures cannot be "circularized" at load
time.
Alternative (a) is, in some sense, the "easiest", although the ugliest.
Alternative (b) is also easy, but it might be cumbersome, depending on
the volume, and complexity, of your #n#/#n= constructs.
I guess alternative (d) is to hack the bin-dumper/loader :-)
Tim Daly
IBM T.J.Watson Research
Yorktown Heights, N.Y.
DALY@IBM.COM