Hi Matt, GENERIC: dispatches on the value at the top of the stack. Try GENERIC# instead.
\ GENERIC# help Slava On Fri, Jan 29, 2010 at 5:59 PM, Matt Gushee <[email protected]> wrote: > Hello, folks-- > > As part of a rather ambitious project that I'm not quite ready to > discuss[*], I have created a class called 'vobject', meaning 'validated > object'. Basically, it is a tuple that wraps an object whose value is > constrained by an arbitrary predicate; whenever you create an instance > of the class or try to set the value, the new value is checked against > the predicate. Here's what the code looks like: > > MACRO: or-null-predicate ( quot -- ) > [ { [ null = ] } swap suffix '[ _ || ] ] ; > > TUPLE: vobject predicate value ; > : <vobject> ( predicate value -- vobject ) > swap [ call t assert= ] 2keep > vobject new > swap >>predicate swap >>value ; inline > > TUPLE: nullable-vobject < vobject ; > : <nullable-vobject> ( predicate value -- vobject ) > swap or-null-predicate [ call t assert= ] 2keep > nullable-vobject new > swap >>predicate swap >>value ; inline > > TUPLE: free-vobject < vobject ; > : <free-vobject> ( value -- vobject ) > free-vobject new [ drop t ] >>predicate swap >>value ; > > GENERIC: ::> ( vobject -- value ) > GENERIC: >:: ( vobject newval -- vobject ) > > M: vobject ::> > value>> ; > M: vobject >:: > over predicate>> dupd call( val -- ? ) t assert= >>value ; > M: free-vobject >:: > >>value ; > > [The purpose of having the free-vobject class is to be able to easily > mix constrained and unconstrained values, and be able to access them in > a consistent way] > > For the most part, this all seems to work as expected. However, I find > that the setter word, >::, raises an error but I don't understand why. > Here's what happens: > > ( scratchpad ) ! Here's a silly example > ( scratchpad ) [ [ string? ] [ length 3 = ] bi and ] "abc" <vobject> > > --- Data stack: > T{ vobject f ~quotation~ "abc" } > ( scratchpad ) ! First, I'll manually perform the steps to validate and > set the value: > > --- Data stack: > T{ vobject f ~quotation~ "abc" } > ( scratchpad ) "xyz" > > --- Data stack: > T{ vobject f ~quotation~ "abc" } > "xyz" > ( scratchpad ) over predicate>> dupd call( val -- ? ) t assert= >>value > > --- Data stack: > T{ vobject f ~quotation~ "xyz" } > ( scratchpad ) ! Yes, that's what's supposed to happen. Now I'll use the >>:: word: > > --- Data stack: > T{ vobject f ~quotation~ "xyz" } > ( scratchpad ) "mmm" >:: > > At this point I get an error popup saying: > > Generic word >:: does not define a method for the string class. > Dispatching on object: "mmm" > > Why is it dispatching on the object "mmm"? I would appreciate your > insights into this puzzle. > > > [*] because I think what I have in mind may be way over my head, but I > need to > mess around with the idea a bit before deciding whether I really > want to do it > -- > Matt Gushee > [email protected] > > ------------------------------------------------------------------------------ > The Planet: dedicated and managed hosting, cloud storage, colocation > Stay online with enterprise data centers and the best network in the business > Choose flexible plans and management services without long-term contracts > Personal 24x7 support from experience hosting pros just a phone call away. > http://p.sf.net/sfu/theplanet-com > _______________________________________________ > Factor-talk mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/factor-talk > ------------------------------------------------------------------------------ The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com _______________________________________________ Factor-talk mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/factor-talk
