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