Newbie questions about Pliant

Newbie questions about Pliant

variable keywords (meta)

Can we substitue variables as a pliant command?
Message posted by maybe Bryan on 2002/06/04 23:08:17
I want to make dynamic control statements. I was reading the meta programming
section but I'm not sure on how to proceed to accomplish this.
Consider the statement:
if a < b
  blah

What if I don't know before hand what the operator should be? Can I write
something like (consider the following as psuedo-code):

select "operator" (var Str op)
  option ">" ">"
  option "<" "<"
  option "=" "="
if a op b
  blah

Or if we wanted to get a little wild:
op:=">"
control:="if"
control a op b
  blah
Message posted by maybe Marcus on 2002/06/05 17:01:28
Hello Bryan.

I am also interested in learning how to do things similar to that.

I think the best start is to study 
1- Pliant's compiling mechanism 
http://pliant.cx/pliantdocs/babel/universal/pliant/language/compiler/tutorial/overview.html
2- Pliant's parser mechanism (doc under construction)
 http://pliant.cx/pliantdocs/babel/universal/pliant/language/parser/extend.html
3- Meta programming (doc not reviewed yet)
Message posted by maybe Hubert Tonneau on 2002/06/05 20:05:18
You should have a look at 'runtime_compile' instruction.

A fiew points about your idea:
. you need to aquire 'pliant_compiler_semaphore' semaphore before
  calling 'runtime_compile'
. it should be very slow

Basically, an interpreter would be much more efficient for doing such things.

Here is an untested sample implementation (proably not working):

module "/pliant/language/compiler.pli"
gvar CBool cond ; gvar Sem sem
select "operator" (var Str op)
  option ">" ">"
  option "<" "<"
  option "=" "="
button "go"
  pliant_compiler_semaphore request
  runtime_compile op (cast op Ident)
    cond := op a b
  if cond
    blah
  pliant_compiler_semaphore release

Another remark: I've written (op a b) and not (a op b) because '>' is
recognized and handled as an operator at parsing time, so since 'op' is
not recognized as an operator, you have to do the folding by hand.