Thank you Alex and AlexG,

The definition of tail was the only thing I had to change in order to make
mPL work after expanding the cell to 4 words :) (ofcourse, I had to change
gen3m as well).

Using an index into an array to encode the function pointer seems like an
interesting idea. Although I think I would have to adjust how isNum is used
everywhere. I will perhaps try it after I am done with my 4 word experiment
:) [my eventual goal with this experiment is to run mPL with libuv :) and
then perhaps try a 3 word cell]

Regards,
Kashyap



On Thu, Aug 27, 2020 at 3:28 AM Alex Gilding <alexg.n...@gmail.com> wrote:

> One technique in C for mapping incompatible pointer or alignment sizes
> (for when you can't, or don't want to, convert directly between
> pointer and `intptr_t`) is to use an intermediate array, and instead
> of storing native pointers, store indexes into this array.
>
> For your case you could put all the native functions in a C array, and
> expose them to miniPicoLisp by taking the index in this array and
> shifting it up by miniPicoLisp's _assumed_ alignment, to make space
> for the tag bits (which becomes a "virtual" alignment with no special
> connection to the C implementation). To dereference the mPL reference
> to a native function, shift the tag bits away again, and look up the
> function pointer at that index in the intermediate array.
>
> While this does also impose a size cost, it doesn't impose that cost
> on all Lisp-side objects the way changing the cell structure would,
> only on native functions (or, on any other C-side object you wanted to
> do this for), which will probably (hopefully?) only make up a very
> small minority of the objects a Lisp program wants to manipulate, and
> is also a constant-sized container in most programs. The shift and
> indirection instead of no-op conversion from integer to callable
> pointer introduces a runtime cost, but it wouldn't be all that high.
>
> This is one way to simulate C function pointers on targets that don't
> expose function pointers in a directly-convertible way at all (e.g.
> JVM).
>
> Using indices instead of native pointers generalizes to any object
> kind for similar costs, e.g. you can translate a 16-bit Lisp word size
> for a 64-bit C host program by doing the same thing for cells in
> general, if you really want. One interesting consequence of this is
> that if you put different base cell types into different heap arrays,
> you get a reinterpretation of the tag bits as a heap-selection index
> for different types, instead of as sub-cell pointers. This starts to
> become a completely different model from picoLisp's very simple and
> elegant word-offset manipulation, though (almost the exact opposite).
>
> Whereas _limiting_ the idea to function pointers has the advantage
> that since a function pointer is strictly supposed to be "opaque"
> anyway from the C perspective - it's not data, it's not expected to be
> accessible as data, the pointer's value isn't meaningful in
> object/size/etc. terms, only as an identity - you don't fundamentally
> change the meaning of the interpreter model on the C side, you just
> change the cast operation from a no-op to an actual conversion. The
> rest of the picoLisp word manipulation system remains untouched,
> keeping the pointer adjustment concept and the homogeneous heap.
>
> AlexG
>
>
> On 27/08/2020, Alexander Burger <a...@software-lab.de> wrote:
> > On Wed, Aug 26, 2020 at 11:16:48PM -0700, C K Kashyap wrote:
> >> About why I am trying it - it's primarily just a learning exercise for
> >> me.
> >> What I am trying is expanding the cell to 4 words instead of two and use
> >> the extra words as the meta data and not require tagged pointers. This
> >> way
> >
> > I see.
> >
> >> I could even build it with TCC that does not seem to align functions at
> 4
> >> byte boundary.
> >
> > OK, function pointer alignment is a different issue. You can however
> encode
> > the
> > pointer in different ways. Some versions of PicoLisp shift'ed and or'ed
> it.
> >
> >
> >> Sorry if I am missing something, but wouldn't x-1 result in shifting the
> >> pointer by 8 bytes instead of 4 (since size of cell is 8). Which is
> >> probably why cdr is used instead of car?
> >
> > Yes. x-1 is minus 8 bytes, and the cdr adds 4 bytes. So the physical
> access
> > goes
> > to -4.
> >
> > ☺/ A!ex
> >
> > --
> > UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe
> >
>
> --
> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subjectUnsubscribe
>
>

Reply via email to