public void CallTest() { // Number.parse("2") // (Number.parse)(Number,"2") SRUExpression exp = new SRUCallExpression() { Method = new SRURefExpression() { Env = new SRURefExpression() { Env = null, Name = "Number", }, Name = "parse", }, Args = new SRUExpression[]{ new SRURefExpression() { Env = null, Name = "Number", }, new SRUStringExpression(){ Value = "2", }, }, }; Assert.AreEqual(Library.Evaluator.Invoke("eval_expression", exp).ToString(), "<Number: 2 >"); }
public SRUObject Visit(SRUCallExpression call) { SRUObject proc = call.Method.Accept(this); SRUObject[] args = new SRUObject[call.Args.Length]; for (int i = 0; i < args.Length; i++) { args[i] = call.Args[i].Accept(this); } return proc.Call(args); }
public void ClosureTest() { // {|a| a }(Number) SRUExpression exp = new SRUCallExpression() { Method = new SRUClosureExpression() { FormalArgument = new string[] { "a" }, Expressions = new SRUExpression[]{ new SRURefExpression(){ Env = null, Name = "a", }, }, }, Args = new SRUExpression[]{ new SRURefExpression() { Env = null, Name = "Number", }, }, }; Assert.AreEqual(Library.Evaluator.Invoke("eval_expression", exp).ToString(), "Number"); }
public void ExpTest() { // 1 + 2 // Number.parse("1") + Number.parse("2") // Number.parse("1").add(Number.parse("2")); // {|a,b| (a.add)(a,b))(Number.parse("1"),Number.parse("2")) // {|a,b| (a.add)(a,b))({|a,b| (a.parse)(a,b)}(Number,"1"),{|a,b| (a.parse)(a,b)}(Number,"2")) SRUExpression exp = new SRUCallExpression() { // {|a,b| (a.add)(a,b) } Method = new SRUClosureExpression() { FormalArgument = new string[] { "a", "b" }, Expressions = new SRUExpression[]{ // (a.add)(a,b) new SRUCallExpression(){ //(a.add) Method = new SRURefExpression{ Env = new SRURefExpression(){ Env = null, Name = "a", }, Name = "add", }, // (a,b) Args = new SRUExpression[]{ new SRURefExpression(){ Env = null, Name = "a", }, new SRURefExpression(){ Env = null, Name = "b", }, }, }, }, }, Args = new SRUExpression[]{ // {|a,b| (a.parse)(a,b)}(Number,"1") new SRUCallExpression(){ // {|a,b| (a.parse)(a,b)} Method = new SRUClosureExpression(){ FormalArgument = new string[]{ "a", "b" }, Expressions = new SRUExpression[]{ // (a.parse)(a,b) new SRUCallExpression(){ // (a.parse) Method = new SRURefExpression{ Env = new SRURefExpression(){ Env = null, Name = "a", }, Name = "parse", }, // (a,b) Args = new SRUExpression[]{ new SRURefExpression(){ Env = null, Name = "a", }, new SRURefExpression(){ Env = null, Name = "b", }, }, }, }, }, // (Number,"1") Args = new SRUExpression[]{ new SRURefExpression(){ Env = null, Name = "Number", }, new SRUStringExpression(){ Value = "1", }, }, }, // {|a,b| (a.parse)(a,b)}(Number,"2") new SRUCallExpression(){ // {|a,b| (a.parse)(a,b)} Method = new SRUClosureExpression(){ FormalArgument = new string[]{ "a", "b" }, Expressions = new SRUExpression[]{ // (a.parse)(a,b) new SRUCallExpression(){ // (a.parse) Method = new SRURefExpression{ Env = new SRURefExpression(){ Env = null, Name = "a", }, Name = "parse", }, // (a,b) Args = new SRUExpression[]{ new SRURefExpression(){ Env = null, Name = "a", }, new SRURefExpression(){ Env = null, Name = "b", }, }, }, }, }, // (Number,"2") Args = new SRUExpression[]{ new SRURefExpression(){ Env = null, Name = "Number", }, new SRUStringExpression(){ Value = "2", }, }, }, }, }; Assert.AreEqual(Library.Evaluator.Invoke("eval_expression", exp).ToString(), ""); }
public void ClosureTest2() { // {|a,b| (a.parse)(a,b) }(Number,"3") SRUExpression exp = new SRUCallExpression() { Method = new SRUClosureExpression() { FormalArgument = new string[] { "a", "b" }, Expressions = new SRUExpression[]{ new SRUCallExpression(){ Method = new SRURefExpression(){ Env = new SRURefExpression(){ Env = null, Name = "a", }, Name = "parse", }, Args = new SRUExpression[]{ new SRURefExpression(){ Env = null, Name = "a", }, new SRURefExpression(){ Env = null, Name = "b", }, }, }, }, }, Args = new SRUExpression[]{ new SRURefExpression() { Env = null, Name = "Number", }, new SRUStringExpression(){ Value = "3", }, }, }; Assert.AreEqual(Library.Evaluator.Invoke("eval_expression", exp).ToString(), "<Number: 3 >"); }