clover
Version:
a toy language
84 lines (53 loc) • 2.19 kB
text/coffeescript
apply = (Runtime)->
class Runtime.Context
constructor: ->
= {}
has_local: (name)->
name of
try_get: (name)->
if
[name]
try_set: (name, value)->
if name of
name, value
get: (name)->
( || new Runtime.Null()).bind(this, name)
set: (name, value)->
||
set_local: (name, value)->
[name] = value
class Runtime.GlobalContext extends Runtime.Context
constructor: ->
super()
# TODO : for test only, remove later
'print', new Runtime.PrintFunction()
'dump', new Runtime.DumpFunction()
class Runtime.ClassContext extends Runtime.Context
constructor: ( , )->
super()
= true
has_local: (name)->
super(name) || ( ? && .has_local(name))
try_get: (name)->
super(name) || ( ? && .try_get(name)) || ( && .try_get(name))
class Runtime.InstanceContext extends Runtime.Context
constructor: ( , )->
super()
try_get: (name)->
super(name) || .try_get(name)
try_set: (name, value)->
if || .has_local(name)
class Runtime.FunctionContext extends Runtime.Context
constructor: ( , , )->
super()
try_get: (name)->
super(name) || .try_get(name) || .try_get(name) || .try_get(name)
try_set: (name, value)->
super(name, value) || .try_set(name, value) || ( ? && .try_set(name, value)) || ( ? && .try_set(name, value))
class Runtime.BlockContext extends Runtime.Context
constructor: ( )->
try_get: (name)->
super(name) || .try_get(name)
try_set: (name, value)->
super(name, value) || .try_set(name, value)
exports.apply = apply