Hi Alex,

Thanks for the explanation. I think I’ll have to adjust EmuLisp then, so it 
will follow Ersatz more closely.

/Jon

On 23. Jun, 2014, at 16:36, Alexander Burger <a...@software-lab.de> wrote:

> Hi Jon,
> 
>> In the docs at <http://www.software-lab.de/doc/ref.html#symbol> I read
>> that "The CDR of a symbol cell is also called VAL, and the CAR points to
>> the symbol's tail”, but in the Ersatz code (built from fun.src) I see
>> this ...
> 
> Right.
> 
>>   final static class Symbol extends Any {
>>      Object Obj;
>>      Any Prop[];
>>      String Name;
>> 
>>      Symbol(Any val, String nm) {
>>         Car = val == null? this : val;
>>         Name = nm;
>>      }
>> 
>> … and here it seems to me that you store the Symbol’s value in the ‘Car’.
> 
> Correct. ErsatzLisp cannot use that very efficient two-pointer cell
> structure, because Java doesn't have pointers! :(
> 
> Instead, the cell structure must be emulated in an object. This is
> unfortuate, because instead of 8 bytes (on a 32-byte system), a symbol
> in ErsatzLisp needs 44 bytes (iirc).
> 
> 
>> Can you explain why it is CDR==VAL in the docs, but "Car = val”
>> (instead of "Cdr = val”) in Ersatz?
> 
> This is not so wrong as it might look ;-)
> 
> The description above is about the _cell_ structure of a symbol
> 
>            Symbol
>            |
>            V
>      +-----+-----+
>      |  |  | VAL |
>      +--+--+-----+
>         | tail
>         |
>         V
> 
> BUT the behavior of the function 'car' is different: It is just a
> pointer-dereference! It takes the value where a pointer points to.
> 
> In case of a (list) cell
> 
>      Pair
>      |
>      V
>      +-----+-----+
>      | CAR | CDR |
>      +-----+-----+
> 
> the pointer points to the first _half_ of the cell, and dereferencing it
> gives the 'CAR' value.
> 
> But if you look at the diagram of the symbol above, you see that the pointer
> points to the _second_ half of the cell, yielding the 'VAL'.
> 
> 
> If you look at the doc of 'car', you see
> 
>   (car 'var) -> any
> 
> telling us that 'car' accepts a 'var' (which is either a symbol or a cell), 
> while
> the function 'cdr'
> 
>   (cdr 'lst) -> any
> 
> only accepts a 'lst' (either NIL or a cell).
> 
> So the function 'car' can be applied to both a symbol or a list cell,
> and will return a meaningful value, while 'cdr' can't do that (as also
> follows from the 'Symbol' diagram above: Applying 'cdr' to a symbol
> would return the CAR of the _next_ cell in memory, giving meaningless
> results).
> 
> (car 'Sym) is equivalent to (val 'Sym).
> 
> All that behavior is a result of the pointer tag systematics of
> PicoLisp.
> 
> ♪♫ Alex

PԔ � &j)m����X�����zV�u�.n7�

Reply via email to