A Smoll game engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

85 lines
2.1 KiB

namespace Smoll.Ex4.Commands {
interface ICommand{
void Perform(List<IScriptable> stack);
}
class PushNumberCommand : ICommand
{
public double self;
public PushNumberCommand(double value) {
self = value;
}
public void Perform(List<IScriptable> stack)
{
stack.Add(new Number(self));;
}
}
class PushStringCommand : ICommand
{
public string self;
public PushStringCommand(string value) {
self = value;
}
public void Perform(List<IScriptable> stack)
{
stack.Add(new Commands.String(self));;
}
}
class PushAtomCommand : ICommand
{
public string self;
public PushAtomCommand(string value) {
self = value;
}
public void Perform(List<IScriptable> stack)
{
stack.Add(new Commands.Atom(self));;
}
}
class AddNumberCommand : ICommand
{
public void Perform(List<IScriptable> stack)
{
if(! stack.TakeLast(2).All(x => x is Ex4.Commands.Number)) {
throw new Exception("Bad arguments to add as numbers");
}
var ret = stack.TakeLast(2).Cast<Ex4.Commands.Number>().Select(x => x.value).Sum();
stack.RemoveAt(stack.Count - 1);
stack.RemoveAt(stack.Count - 1);
stack.Add(new Number(ret));
}
}
class PrintCommand : ICommand
{
public void Perform(List<IScriptable> stack)
{
var ret = stack.Last();
stack.RemoveAt(stack.Count - 1);
System.Console.Out.Write(ret.ToString());
}
}
class CompositeCommand : ICommand
{
List<ICommand> executable;
public CompositeCommand(List<ICommand> executable) {
this.executable = executable;
}
public void Perform(List<IScriptable> stack)
{
foreach (var item in executable)
{
item.Perform(stack);
}
}
}
}