Hi Alex, thank you. helps a lot.
cheers /e On Sun, Aug 28, 2011 at 2:53 AM, Alexander Burger <a...@software-lab.de> wrote: > Hi Edwin, > >> came across these macros in pico.h: >> >> #define isSym(x) (num(x)&WORD) >> #define isSymb(x) ((num(x)&(WORD+2))==WORD) >> >> what is the intent of isSymb()? as compared to isSym()? > > as ever, the files "doc64/structures", "doc/structures" and > "mini/doc/structures" are the absolute key to the understanding of the > working of the different PicoLisp interpreters. They are the "bible" for > the internals of PicoLisp. > > > The 64-bit version has separate tag bits for each data type: > > cnt xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxS010 > big xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxS100 > sym xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1000 > cell xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000 > > That is, if you AND a pointer with 2, you can test for a short number, > with 4 for a bignum, with 6 for a number in general (cnt or big), and > with 8 for a symbol. > > > A similar case for the 32-bit version: > > xxxxxxxxxxxxxxxxxxxxxxxxxxxxx010 Number > xxxxxxxxxxxxxxxxxxxxxxxxxxxxx100 Symbol > xxxxxxxxxxxxxxxxxxxxxxxxxxxxx000 Cell > > It has no short numbers, so 2 checks for a number, and 4 for a symbol. > > > In MiniPicoLisp, however, things are a little different. It has no bignums, > so the patterns > > num xxxxxx10 > sym xxxxx100 > cell xxxxx000 > > indicate that 2 also tests for a number, but because of the lack of > bignums, we want a number range as big as possible. For that reason, all > remaining bits (the 'x'es) can be used for a number (e.g. 30 bits if you > compile Mini on a 32-bit architecture). > > However, just testing for 4 does not guarantee that you indeed have a > symbol. It might also be an odd number (which happens to have a least > significant bit set to one). > > Now look at > > #define isSym(x) (num(x)&WORD) > > It is the "naive" form. WORD is 4 on a 32-bit system, so this macro just > tests for 4. You can use it when you already know that you _don't_ have > a number. This is quite often the case, when the arguments of a function > are analyzed, and you first test for a number. > > If you want to immediately test for a symbol (without first checking for > a number), you shoule use > > #define isSymb(x) ((num(x)&(WORD+2))==WORD) > > This effectively does an AND with 6, then compares to 4. This is more > expensive that just the AND with 4 above, because for an odd number the > AND with 4 will return 6 (and not 4). > > In summary, having these two macros is a matter of efficiency. > > > BTW, this potential conflict also exists in the 64-bit version. The two > number types have their sign bit (the 'S' in the patterns above) in the > position of the symbol tag. A simple 'AND 4' shows the same problem, in > that a symbol cannot be distingished from a negative number. Therefore, > the 64-bit code always checks for a number before it checks for a > symbol. > > The 32-bit version is clean in that regard. You can test for any type at > any time, without worrying for conflicts. > > Cheers, > - Alex > -- > UNSUBSCRIBE: mailto:email@example.com?subject=Unsubscribe > -- UNSUBSCRIBE: mailto:firstname.lastname@example.org?subject=Unsubscribe