[postmodern-devel] Can't redefine slots as columns - why?

Lucas Hope lucas.r.hope at gmail.com
Tue Mar 10 09:10:37 UTC 2009


Hi Marijn,

I stubbed out the form and the dao-circle was successfully compiled (of course).

However the example circle I tried to make did not have its slot value
set.  I understand (I think) what you were trying to do with the
*direct-column-slot* special variable, but maybe in this case (on
Allegro CL, btw),  while the effective-slot-definition-class works
correctly (indicated by the correct CREATE TABLE below),  the actual
effective-column-slot object is instantiated OUTSIDE the scope of the
binding in compute-effective-slot-definitio which sets
*direct-column-slot* to non-nil.

There's no reason for the lisp implementation to instantiate the class
returned by effective-column-slot immediately, as far as I can tell.

(dao-table-definition 'dao-circle) ;; success!
"CREATE TABLE dao_circle (radius REAL NOT NULL)"

(setf circle (make-instance 'dao-circle :radius 5.0))

(slot-boundp circle 'radius)
=> NIL ;; fail. :(

-Luke

On Tue, Mar 10, 2009 at 6:19 PM, Marijn Haverbeke <marijnh at gmail.com> wrote:
> Hello Luke,
>
> I think (though I'm never entirely sure with this MOP stuff) that that
> error is only there becuase I hadn't thought of the way you are trying
> to use this metaclass, and assumed redefining a slot as a column was
> always an accident. Could you try killing the WHEN-form on line 97 of
> postmodern/table.lisp, doing what you're trying to do, and reporting
> back whether it works as hoped?
>
> Best,
> Marijn
>
>
> On Tue, Mar 10, 2009 at 1:11 AM, Lucas Hope <lucas.r.hope at gmail.com> wrote:
>> Hi there,
>>
>> I am just getting my feet wet with postmodern.  It looks like I will
>> be doing some heavy development with it for the next couple of weeks.
>> Wish me luck!
>>
>> My (first?) issue is that I want to do something similar to the
>> following example code.  Here CIRCLE is an in-memory implementation of
>> a circle, and it is desired to create a DAO object which moves storage
>> to a postgres backend. (We have lots of circles...)
>>
>> Pretend CIRCLE has a host of useful functionality attached and I can't
>> just point all the defmethods to DAO-CIRCLE.
>>
>> (defclass SHAPE () ())
>>
>> (defclass CIRCLE (SHAPE)
>>  (radius))
>>
>> (defclass DAO-CIRCLE (CIRCLE)
>>  ((radius :col-type real))
>>  (:metaclass dao-class))
>>
>> (dao-table-definition 'dao-circle)
>> => ERROR: Slot RADIUS in class #<DAO-CLASS DAO-CIRCLE> is both a
>> column slot and a regular slot.
>>
>> Why doesn't this work, and how can I make it work?  It seems like this
>> is useful functionality to have.  I want the DAO-CIRCLE's radius to be
>> a column slot.
>>
>> Cheers,
>>
>> -Luke
>>
>> _______________________________________________
>> postmodern-devel mailing list
>> postmodern-devel at common-lisp.net
>> http://common-lisp.net/cgi-bin/mailman/listinfo/postmodern-devel
>>
>
> _______________________________________________
> postmodern-devel mailing list
> postmodern-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/postmodern-devel
>



-- 
---------------------------------------------------
Dr Lucas Hope - (646) 2332123 after 3pm US EST
Machine Learning and Software Engineering Consultant
Melbourne, Australia




More information about the postmodern-devel mailing list