Newbie questions about Pliant

Newbie questions about Pliant

Anonymous Function

I would like my meta to create an anonymous function
(which will be later used as a callback). How can I do it ?
Message posted by maybe Boris Reitman on 2004/01/10 07:31:17
Hi,

I would like something along the lines,

var Function f
# set the arguments type and return value type
# set the body

# compile it and add to the expression
e add f:body # or sowething like this

# then I can do whatever I want with f, e.g call it
e add (instruction f e:0:result)

How do I do this?  I don't find any docs about Function datatype.
I looked at function.c but I am not sure how to define the body
of the function -- how do I add instructions to it ?  A simple example
would be great: I want the generated function to receive an integer,
call some other function passing that integer, and return whatever 
that called function returns.

Thanks,
Boris


Message posted by hubert.tonneau on 2004/01/10 13:06:34
A sample code you might study is 'function_meta2' in module /pliant/language/basic/extend.pli
which is implementing the 'function' meta,
and 'arg_type_meta' un the same module, which is implementing 'arg' meta.

You may also look at the 'C_function' function at the end of module
/pliant/language/compiler/function/function.c which is called many many time
in 'intialize' function in module /pliant/language/startup/startup.pli in order
to record as a Pliant object the prototype of each existing C function.

Latly, if you want to look at 'Expression_execute' in module
/pliant/language/compiler/expression/expression.c which is much simpler since
it defines, compiles and execute a function with no arguments.
Message posted by maybe Boris Reitman on 2004/08/11 00:41:25
Hi,

Here is the net result that I am trying to achieve.  Say user would write 
something like this

perl_function xxx i j -> k
  arg Int i j
  k := i + j

This would be written as something like this,

function xxx i j -> k
  arg Int i j
  k := i + j

function xxx in -> out
  arg PerlArray in out
  out:0 := xxx in:0 in:1


I have started with the following simple program.
Why doesn't it work ?

---------------------------------
module "/pliant/language/compiler.pli"
module "/pliantx/language/perl.pli"
module "/pliantx/lexer/multiline_string.pli"

meta perl_function e
  if e:size > 0
    console "here: " e:0:ident eol
    var Link:Expression func_mainbody_expr expr
    func_mainbody_expr :> expression ident "function" near e subexpressions (e 0 e:size-1)

    e compile_as func_mainbody_expr

perl_function helloworld i -> j
  arg Int i j
  console "hello world" eol

helloworld
----------------------

output:
$ pliant autofunc.pli
here: helloworld
----------------------------------------------------------------
Failed to compile function   ('helloworld'  'i'  '->'  'j')
  compile file:autofunc.pli (internals) 13 1
----------------------------------------------------------------
actions stack is:
parse file:autofunc.pli (internals) 17 1
module file:autofunc.pli
----------------------------------------------------------------
processor stack content is:
error_notify_fatal (ErrorID Str) +14
error_report +61
error_renotify (ErrorID Address Str) +41
. compile (Expression) +125
  file:autofunc.pli (internals) 13 1
parser_tag_record  /pliant/language/type/misc/tag.pli (internals) 182 1
. execute (ParserContext) +39
parser_filter_execute +240
pliant internal parse_one_token function (ParserContext) +391
compile_text (List Module) +230
pliant_load_module (Str Module Int Module) +920
??? at 134599684
----------------------------------------------------------------

Also, how can I get a hold of the signature of
func_mainbody_expr ?  Can I know this right after I compile it ? 
Is something along these lines going to work ?

  func_mainbody_expr compile
  var Function f := 'pliant general dictionary' findfirst e:0



Thanks,
Boris


Message posted by hubert.tonneau on 2004/08/11 08:16:52
See the error message:
Failed to compile function   ('helloworld'  'i'  '->'  'j')

You have discarded the body of the function because you have no argument after 'j'
The body argument should have been visiable as a question mark.

So the solution is:
  func_mainbody_expr :> expression ident "function" near e subexpressions (e 0 e:size)