Gabriele,

I'm in a similar situation with a plain old procedural language. I want to have builtins for things that parrot provides as pir instructions.

However, I've noticed that the pir-provided builtins are generally primitive. For example, the "print" opcode only accepts one argument, the push and unshift opcodes only move one value to the deque, etc.

I think (and have implemented) that the solution is to define "builtins" that mimic the names of the pir opcodes,
but which do "the right thing" vis-a-vis multiple args, etc.

In my case, that makes the builtins into language-magic. In your case, if you want them to be first class functions you will have to code some functions around them.

What you might consider is building in an "inline pir" function, and defining everything else in terms of that. (I put an asm(args) {{ block }} in my language, but my builtins were handled by having the compiler generate the inline code.)

Cheers,

=Austin


gabriele renzi wrote:
Hi everyone,

I'm not sure this is the right place but I don't remember a
parrot-users mailing list (and at least it's not listed on the parrot
website).

Anyway, I'm writing a small article about parrot and I was
implementing a tiny language with lexical scope and first class
functions.
Although I know how to create closures in my language and I can call
them ok, I still have a problem:

if I use variable lookup to access my functions, it doesn't find the
pir-defined routines, while if I use the normal function lookup it
does not consider the lexical functions defined as variables.

I did solve this once managing scopes explicitly in the grammar
(following the Squaak example) and having something like

for (scopes() )
  if $_.symbol($<name>)
   call closure
   found = true
if not found
  call fun $<name>

but I don't like this and it still does not allow passing the builtins
around  (moreover  I was happily avoiding the whole manual scope
management :).


It seems to me there are a few  options,
* install the symbols explicitly in the top level namespace (should
work, but requires duplicated effort when defining a new builtin)
* have some trap function in the variable lookup mechanic that fetches
the function if all else fails (nice, seems to be python's behaviour,
but is it possible?)
* register the namespace where functions are defined (package?) as the
parent namespace for the top level scope (a PAST::Block/immediate
defined in TOP)

All of these, though, I have no clue on how to implement :)
As this seems a problem common to many lisp-1-ish languages (python,
ecmascript, scheme) I guess there is a proper way of doing it but I
don't know how to approach it, is there a documented way or an obvious
way I'm overlooking? Is this something worth documenting for future
implementors?

Thanks in advance, and sorry if I ask dumb questions.
_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

Reply via email to