Newbie questions about Pliant

Newbie questions about Pliant

Delayed Actions

propagating local argument created in a meta
to delayed actions.
Message posted by maybe Boris Reitman on 2007/05/30 01:40:04
Here is the code the illustrates the problem:
----8<------------
module "/pliant/language/compiler.pli"

gvar Link:Argument g_x

meta add_new_local e
  if e:size > 0
    return
  g_x :> argument local Str
  e set_void_result

meta x e
  if e:size > 0
    return
  e set_result g_x access_read_write

gvar DelayedAction da

function record_delayed_action da_
  arg DelayedAction da_
  da := da_

meta record_action e
  if e:size <> 1
    return
  var Link:List expressions :> new List
  expressions append addressof:(e e:size-1)
  var Link:List byaddress :> new List
  var Pointer:Module module :> e module
  var Address mark := module mark
  var List functions ; var Link:Type type
  e freeze expressions byaddress functions type
  module rewind mark ?
  e add (instruction (the_function record_delayed_action DelayedAction) (e e:size-1):result)
  e set_void_result

function execute1 a f
  arg Address a ; arg Function f
  indirect

function test
  add_new_local
  x := "hello"
  console "got x = " x eol
  record_action
    console "in delayed action, x = " x eol
  execute1 da:parameter da:function

test
---->8------------

The output:

---8<---
got x = hello
in delayed action, x = 
--->8---

How do I get local variable x that I have created in the add_new_locals
meta to appear in the delayed action ?  

I need it to get my template code to support parameters:

template "... <TEMPLATE name="A" value="hello"> ..."
  template_section "A"
    console "got value = " template_value  # will print "hello"

somehow, I must supply "template_value" to this block of code, but 
i don't want to explicitely define it with "var Str template_value"
i would like to have "template_section" meta to create it for the block
and initialize it properly before calling it as a delayed action.

Thanks,
Boris