Re: Symbol Car and CDR

2014-06-24 Thread Jon Kleiser
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  wrote:

> Hi Jon,
> 
>> In the docs at  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)mX�����zV�u�.n7�

Re: Symbol Car and CDR

2014-06-23 Thread Alexander Burger
Hi Jon,

> In the docs at  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
-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe


Symbol Car and CDR

2014-06-23 Thread Jon Kleiser
Hi Alex,

In the docs at  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 ...

   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’.
Can you explain why it is CDR==VAL in the docs, but "Car = val” (instead of 
"Cdr = val”) in Ersatz?

/Jon--
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe