﻿/**
 * Authors: k.inaba
 * License: NYSL 0.9982 http://www.kmonos.net/nysl/
 *
 * Runtime data structures for Polemy programming language.
 */
module polemy.runtime;
import polemy._common;

class PolemyRuntimeException : Exception
{
	this(string msg) { super(msg); }
}

abstract class Value
{
}

class IntValue : Value
{
	BigInt data;
	mixin SimpleConstructor;
	mixin SimpleCompare;
}

class StrValue : Value
{
	string data;
	mixin SimpleConstructor;
	mixin SimpleCompare;
}

abstract class FunValue : Value
{
	Value call(Value[] args);
}

class PrimitiveFunction : FunValue
{
	Value delegate(Value[]) data;
	mixin SimpleConstructor;
	override Value call(Value[] args) { return data(args); }
}

class Context
{
	Context       parent;
	Value[string] table;
	this(Context parent = null) { this.parent = parent; }

	void add(string i, Value v)
	{
		table[i] = v;
	}
	
	Value opIndex(string i)
	{
		if( i in table )
			return table[i];
		if( parent is null )
			throw new PolemyRuntimeException(sprintf!"variable %s not found"(i));
		return parent[i];
	}

	void opIndexAssign(Value v, string i)
	{
		if( i in table )
			return table[i] = v;
		if( parent is null )
			throw new PolemyRuntimeException(sprintf!"variable %s not found"(i));
		return parent[i] = v;
	}
}
