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

Reply via email to