# $Id: methcall.pliant,v 1.0 2002/02/07 16:39:00 dada Exp $
# http://dada.perl.it/shootout/
# (based on methcall.pliant by pixel@mandrakesoft)
module "/pliant/language/context.pli"
module "/pliant/language/compiler.pli"
meta inherit e
if e:size<>1
return
var Pointer:Type interface :> (e:0 constant Type) map Type
if addressof:interface=null
return
var Pointer:Arrow c :> e:module first "pliant type"
if c=null or entry_type:c<>Type
return
var Pointer:Type implementation :> c map Type
if interface:nb_fields<>0 and implementation:nb_fields<>0
return
for (var Int i) 0 interface:nb_fields-1
var Pointer:TypeField f :> interface field i
implementation define_field f:type f:name f:initial_value
interface maybe implementation
e set_void_result
type Toggle
field Bool state
function init t start_state
arg_w Toggle t ; arg Bool start_state
t:state := start_state
method t value -> r
arg Toggle t ; arg Bool r
return t:state
method t activate -> r
arg_rw Toggle t ; arg Toggle r
t:state := not t:state
return t
type NthToggle
inherit Toggle
field Int count_max
field Int counter
function init t start_state max_counter
arg_w NthToggle t ; arg Bool start_state ; arg Int max_counter
init t start_state
t:count_max := max_counter
t:counter := 0
method t activate -> r
arg_rw NthToggle t ; arg NthToggle r
t:counter += 1
if t:counter >= t:count_max
t:state := not t:state;
t:counter := 0;
return t
function doit n
arg Int n
var Toggle toggle
var Bool val := true
for (var Int i) 1 n
val := toggle:activate:value
console val eol
val := true
var NthToggle ntoggle
init ntoggle val 3
for (var Int i) 1 n
val := ntoggle:activate:value
console val eol
gvar Str s_n := cast ((pliant_script_args translate Address 1) map CStr) Str
if (s_n parse (gvar Int n))
doit n
else
console "usage: methcall.pliant <number>" eol