LangStudies/App/EoI/Scripts/EvaEnv.gd

120 lines
2.5 KiB
GDScript

extends Object
# ---------------------------------------------------------- UTILITIES
var ErrorOut
func check( condition : bool, message : String):
assert(condition, message)
if ! condition:
ErrorOut.text = "Eva - Error: " + message
func throw( message ):
assert(false, message)
ErrorOut.text = "Eva - Error: " + message
# ---------------------------------------------------------- UTILITIES END
class_name EvaEnv
var Records : Dictionary
func define(symbol : String, value) :
Records[symbol] = value
func has(symbol : String) :
return Records.has(symbol)
func lookup(symbol : String) :
check(Records.has(symbol), String("Symbol not found in environment records"))
return Records[symbol]
func set(symbol : String, value) :
check(Records.has(symbol), String("Symbol not found in environment records"))
Records[symbol] = value
return Records[symbol]
func setup_Globals():
Records["null"] = null
Records["true"] = true
Records["false"] = false
func _init(errorOut):
ErrorOut = errorOut
# Serialization ----------------------------------------------------
var SEva
func array_Serialize(array, fn_objSerializer) :
var result = []
for entry in array :
if typeof(entry) == TYPE_ARRAY :
result.append( array_Serialize( entry, fn_objSerializer ))
elif typeof(entry) == TYPE_OBJECT :
if entry.get_class() == "Eva":
result.append(entry)
else:
fn_objSerializer.set_instance(entry)
result.append( fn_objSerializer.call_func() )
else :
result.append( entry )
return result
func to_SExpression():
var expression = []
for key in Records.keys() :
var entry = [key]
var Value = Records[key]
if typeof( Value ) == TYPE_ARRAY :
var \
to_SExpression_Fn = FuncRef.new()
to_SExpression_Fn.set_function("to_SExpression")
var array = array_Serialize( Value, to_SExpression_Fn )
entry.append(array)
elif typeof( Value ) == TYPE_OBJECT :
entry.append( Value.to_SExpression() )
else :
entry.append(Value)
expression.append(entry)
return expression
func to_Dictionary():
var result = {}
for key in Records.keys() :
var Value = Records[key]
if typeof(Value) == TYPE_ARRAY :
var \
to_SExpression_Fn = FuncRef.new()
to_SExpression_Fn.set_function("to_SExpression")
var array = array_Serialize( Value, to_SExpression_Fn )
result[key] = array
elif typeof(Value) == TYPE_OBJECT :
result[key] = Value.to_SExpression()
else :
result[key] = Value
return result
# Serialization END -------------------------------------------------