1
1
mirror of https://github.com/kanaka/mal.git synced 2024-08-17 17:50:24 +03:00
mal/impls/tcl/env.tcl
Joel Martin 8a19f60386 Move implementations into impls/ dir
- Reorder README to have implementation list after "learning tool"
  bullet.

- This also moves tests/ and libs/ into impls. It would be preferrable
  to have these directories at the top level.  However, this causes
  difficulties with the wasm implementations which need pre-open
  directories and have trouble with paths starting with "../../". So
  in lieu of that, symlink those directories to the top-level.

- Move the run_argv_test.sh script into the tests directory for
  general hygiene.
2020-02-10 23:50:16 -06:00

50 lines
1.2 KiB
Tcl

oo::class create Env {
variable outer data
constructor {{outerenv 0} {binds ""} {exprs ""}} {
set outer $outerenv
set data [dict create]
if {$binds != ""} {
for {set i 0} {$i < [llength $binds]} {incr i} {
set b [lindex $binds $i]
if {$b == "&"} {
set varrest [lindex $binds [expr {$i + 1}]]
set restexprs [list_new [lrange $exprs $i end]]
my set $varrest $restexprs
break
} else {
my set $b [lindex $exprs $i]
}
}
}
}
method set {symbol objval} {
dict set data $symbol $objval
return $objval
}
method find {symbol} {
if {[dict exist $data $symbol]} {
return [self]
} elseif {$outer != 0} {
return [$outer find $symbol]
} else {
return 0
}
}
method get {symbol} {
set foundenv [my find $symbol]
if {$foundenv == 0} {
error "'$symbol' not found"
} else {
return [$foundenv get_symbol $symbol]
}
}
method get_symbol {symbol} {
dict get $data $symbol
}
}