In a previous post I mused about having a new new operator for Common Lisp.
The only rub in the scheme I came up with was the handling of DEFSTRUCT constructors, which had to be somehow recorded in the system in order to make them known to the new operator.
The solution was less than satisfactory, and I had been thinking about how to come up with something more pleasant. Now I believe I found something acceptable by relaxing the basic new invariant (cfr., the spec) and admitting two "pseudo" types as arguments. Suppose we had a "pseudo" type (class class-name) and a "pseudo" type (struct structure-class-name). Now I could write:
cl-prompt> (defclass foo () ()) #<STANDARD CLASS FOO> cl-prompt> (newq (class foo)) #<FOO @ 42>The twist is that now I have the right structure to plug in the constructor for structures.
cl-prompt> (defstruct baz q w e) BAZ cl-prompt> (newq (struct baz) :q 42) #S(BAZ :Q 42 :W NIL :E NIL) ; The standard MAKE-BAZ constructor is called. cl-prompt> (defstruct (bar (:constructor barify (a s &optional d) (:constructor new-bar)) a s d) BAR cl-prompt> (newq (struct bar :by barify) 1 2) #S(BAR :A 1 :S 2 :D NIL) cl-prompt> (newq (struct bar :by new-bar) :s 2 :a 1) #S(BAR :A 1 :S 2 :D NIL)
I think this does it and it is not so bad. Any comments?