Newbie questions about Pliant

Newbie questions about Pliant

Generic method

Trying to make a Visitor pattern.
Message posted by maybe Boris Reitman on 2004/11/23 05:53:33
How do I get the following code to work ?
 
-----------
type Visitor
  void

type Finder
  field Int index

Visitor maybe Finder

method visitor visit
  arg_rw Visitor visitor
  generic
  console "in generic" eol

method finder visit
  arg_rw Finder finder
  console "I am now in finder::visit" eol

function traverse visitor
  arg_rw Visitor visitor
  console "in traverse" eol
  visitor visit

function main
  var Finder finder
  traverse finder

main
----------------------------------

Here is the error,

----------------------------------------------------------------
Failed to compile visitor   ('visit')
  compile file:t.pli (internals) 23 3
compile file:t.pli (internals) 21 1
...
--------------------


Message posted by maybe Boris Reitman on 2004/11/23 20:11:18
I should mention that upon the following modification
with which I tried to match the docs as close as possible,
I get segmentation fault, which I don't understand:

===========
module "/pliant/language/compiler.pli"

type Visitor
  void

type Finder
  field Int index

Visitor maybe Finder

method visitor visit
  arg Visitor visitor
  generic
  console "in generic" eol

method finder visit
  arg Finder finder
  console "I am now in finder::visit" eol

function traverse visitor
  arg Link:Visitor visitor
  console "in traverse" eol
  visitor visit

function main
  var Finder finder
  var Link:Visitor ptr :> finder
  traverse ptr

main
====================

Here is the execution,

====================
in traverse
exception 11
----------------------------------------------------------------
actions stack is:
execute file:t.pli (internals) 30 1
parse file:t.pli (internals) 31 1
module file:t.pli
----------------------------------------------------------------
processor stack content is:
. code_offset (FunctionExternal) +1343
_
Message posted by hubert.tonneau on 2004/12/04 11:02:39
In 'main', just replace
  var Finder finder
with
  var Link:Finder finder :> new Finder

If you want to put a link to something through:
  var Link:Visitor ptr :> finder
the thing has to be a Pliant object, what a local variable is not, but the Pliant
compiler does not know at compile time if what you do is right, also in your
simple exemple it could have been catched fairly easily.

Running at debugging level 2 would catch it immediately, and that's why I dont
try to make the compiler any smarter in this area.
The error message at debugging level 2 is:
Attempted to lock an invalid object
...
_noname_  file:/tmp/foo.pli (internals) 30 1 file:/tmp/foo.pli (internals) 30 1 file:/tmp/foo.pli (internals) 27 24
...

Line 27 column 24 is ':>' in:
  var Link:Visitor ptr :> finder