Prevent cloning of clones

Brian Rice water at tunes.org
Tue Apr 26 12:13:06 PDT 2005


On Apr 26, 2005, at 11:50 AM, Adde wrote:

> Thanks! I was just trying to understand when and how to limit further 
> cloning.
> Following your suggestions i came up with the following:
>
> SVG ensureDelegatedNamespace: #Units.
> SVG Units addImmutableSlot: #Pixel valued: (BaseUnit name: 'pixel' 
> abbrev: 'px').
>
> n@(Number traits) px [
>  n with: px
> ].
>
> uv@(UnitValue traits) toXML [
>  (uv value toXML) ; (uv unit abbrev toXML)
> ].
>
> s@(String traits) toXML [
> s
> ].
>
> n@(Number traits) toXML [
>  n as: String
> ].

Interesting.

> I added the px method to Number traits to be able to say: 1 px instead 
> of 1 with: px, don't know if that's a good idea but it certanly makes 
> it easier to use. The other methods are just placeholder for 
> XML-specific formatting.

The "px" message idea has occurred to me before, and I think what I'll 
do is have the BaseUnit creation method name:abbrev: create the method 
for you so you don't have to do it. How does that sound? :)

> I plan on changing the toXML methods into printOn: s@(XMLStream) to 
> match the rest of the environment better.

Cool. You can also do "XML WriteStream" or "XML Document WriteStream" 
or also use "nextPut:" and override per type.

> I feel a bit unsure about the method on UnitValue traits, it feels 
> like I should only provide toXML for my own UnitValues, something like 
> this:
>
> SVG addPrototype: #Unit derivedFrom: {BaseUnit}.
> SVG Unit addImmutableSlot: #Pixel valued: (SVG Unit name: 'pixel' 
> abbrev: 'px').
> SVG addPrototype: #UnitValue derivedFrom: {UnitValue}.
>
> uv@(UnitValue traits) unit: u@(SVG Unit traits) value: v [
>  SVG UnitValue clone `>> [unit: u. value: v.]
> ].
>
> uv@(SVG UnitValue traits) toXML [
>  (uv value toXML) ; (uv unit abbrev toXML)
> ].
>
> At least that works as it should, "(1 px) toXML" works and "(1 kg) 
> toXML" gives an error.

I don't think this is worthwhile; my recommendation is just to shift 
from toXML to the nextPut: overriding and deal with it then. You're 
basically programming over-defensively, since lengths may also count as 
SVG units.

I should mention one issue, though: pixels are not specific to SVG; 
they're specific to the raster display type. Try to just keep it as 
"yet another unit" which will be in the units namespace, and not 
hardcode it as belonging to SVG. I say this because SVG is conceptually 
a particular rendering backend for the UI framework (see src/ui/) and 
as such I will want to have it not duplicate any structures.

> I have to say the language feels good so far, it strikes a fine 
> balance between the beauty of Smalltalk and the raw power of Lisp.

Cool, thanks!

> Brian Rice wrote:
>
>> On Apr 25, 2005, at 1:43 PM, Brian Rice wrote:
>>
>>> I strongly suggest that you just forget about this issue and don't 
>>> worry about the safety factor for now. Focus on the real design 
>>> issues first; your code is a mess and is not re-using the very 
>>> useful library I mentioned above. Try this instead:
>>>
>>> load: 'src/lib/dimensioned.slate'.
>>> SVG addImmutableSlot: #Pixel valued: (BaseUnit name: 'pixel' abbrev: 
>>> 'px').
>>>
>>> Doesn't that look better? It also can be used for actual algebraic 
>>> operations, e.g.:
>>>
>>> Slate> BaseUnit name: 'pixel' abbrev: 'px'.
>>> px
>>> Slate> 4 with: pixel.
>>> 4_px
>>> Slate> it * 5.
>>> 20_px
>>> Slate> it / (1 with: in).
>>> 20_px/in
>>
>> And if you define:
>>
>> x@(UnitValue traits) / y@(Unit traits)
>> [x / (1 with: y)].
>>
>> Then "(72 with: px) / in" works. I'll add that now to the main source 
>> tree.
>>
>>> The underscores are not really suitable for output into XML, but you 
>>> can easily do something different there, or we could fix the 
>>> print-out or provide some other means. In any case, you have 
>>> multi-dispatch and can handle the case specifically in any output 
>>> method.
--
Brian T. Rice
LOGOS Research and Development
http://tunes.org/~water/




More information about the Slate mailing list