aboutsummaryrefslogtreecommitdiffstats
path: root/core/const.moon
diff options
context:
space:
mode:
Diffstat (limited to 'core/const.moon')
-rw-r--r--core/const.moon136
1 files changed, 0 insertions, 136 deletions
diff --git a/core/const.moon b/core/const.moon
deleted file mode 100644
index 99e4178..0000000
--- a/core/const.moon
+++ /dev/null
@@ -1,136 +0,0 @@
-import Op, Action, FnDef from require 'core.base'
-
-local Scope
-load_ = ->
- import Scope from require 'core.scope'
-
-ancestor = (klass) ->
- assert klass, "cant find the ancestor of nil"
- while klass.__parent
- klass = klass.__parent
- klass
-
-class Ref
- new: (@original) =>
-
- get: (...) => @original\get ...
- getc: (...) => @original\get ...
-
- destroy: =>
- update: =>
-
-class Const
- types = {
- sym: true
- str: true
- num: true
- bool: true
- scope: true
- op: true
- opdef: true
- fndef: true
- builtin: true
- }
-
- new: (@type, @value, @raw) =>
- assert types[@type], "invalid Const type: #{@type}"
-
--- Value interface
- get: (type) =>
- assert not type or type == @type, "#{@} is not a #{type}"
- @value
-
- getc: (type) =>
- assert not type or type == @type, "#{@} is not a #{type}"
- @value
-
- update: (dt) =>
- switch @type
- when 'op'
- @value\update dt
-
--- AST interface
- eval: (scope) =>
- switch @type
- when 'num', 'str'
- @
- when 'sym'
- assert (scope\get @value), "undefined reference to symbol '#{@value}'"
- else
- error "cannot evaluate #{@}"
-
- quote: => @
-
- stringify: => @raw
-
- clone: (prefix) => @
- -- in case of doubt:
- -- clone: (prefix) => Const @type, @value, @raw
-
--- static
- __tostring: =>
- value = if @type == 'opdef' or @type == 'builtin' then @value.__name else @value
- "<#{@type}: #{value}>"
-
- __eq: (other) =>
- other.type == @type and other.value == @value
-
- unescape = (str) -> str\gsub '\\([\'"\\])', '%1'
-
- @parse: (type, sep) =>
- switch type
- when 'num' then (match) -> @ 'num', (tonumber match), match
- when 'sym' then (match) -> @ 'sym', match, match
- when 'str' then (match) -> @ 'str', (unescape match), sep .. match .. sep
-
- @num: (num) -> Const 'num', num, tostring num
- @str: (str) -> Const 'str', str, "'#{str}'"
- @sym: (sym) -> Const 'sym', sym, sym
- @bool: (bool) -> Const 'bool', bool, tostring bool
- @empty: -> Const 'str', '', "''"
-
- @wrap: (val, name='(unknown)') ->
- typ = switch type val
- when 'number' then 'num'
- when 'string' then 'str'
- when 'table'
- if base = rawget val, '__base'
- -- a class
- switch ancestor val
- when Op then 'opdef'
- when Action then 'builtin'
- else
- error "#{name}: cannot wrap class '#{val.__name}'"
- elseif val.__class
- -- an instance
- switch ancestor val.__class
- when Op then 'op'
- when Scope then 'scope'
- when FnDef then 'fndef'
- when Const
- return val
- else
- error "#{name}: cannot wrap '#{val.__class.__name}' instance"
- else
- -- plain table
- return Const 'scope', Scope.from_table val
- else
- error "#{name}: cannot wrap Lua type '#{type val}'"
-
- Const typ, val
-
- @wrap_ref: (val) ->
- if base = rawget val, '__base'
- -- a class
- error "#{name}: cannot wrap_ref class '#{val.__name}'"
- elseif val.__class
- -- an instance
- switch ancestor val.__class
- when Op then Ref val
- when Const then val
- else
- error "#{name}: cannot wrap_ref '#{val.__class.__name}' instance"
- else
- error "#{name}: cannot wrap_ref Lua type '#{type val}'"
-
-:Const, :load_