public static plt_node make_exp(ref string exp) { plt_node ret = make_node(ref exp); // do with ( if (ReferenceEquals(ret, left_brackets)) { plt_list r = new plt_list(); while (true) { if (exp.Length <= 0) { break; } ret = make_exp(ref exp); if (ReferenceEquals(ret, right_brackets)) { break; } r.add(ret); } return(r); } //do with ' if (ReferenceEquals(ret, plt_lambda.quote)) { plt_list r = new plt_list(); r.add(plt_lambda.quote); r.add(make_exp(ref exp)); return(r); } //do nothing return(ret); }
public static plt_node make_exp(ref string exp) { plt_node ret = make_node(ref exp); // do with ( if (ReferenceEquals(ret, left_brackets)) { plt_list r = new plt_list(); while (true) { if (exp.Length <= 0) break; ret = make_exp(ref exp); if (ReferenceEquals(ret, right_brackets)) { break; } r.add(ret); } return r; } //do with ' if (ReferenceEquals(ret, plt_lambda.quote)) { plt_list r = new plt_list(); r.add(plt_lambda.quote); r.add(make_exp(ref exp)); return r; } //do nothing return ret; }
public static plt_node quote_node(plt_node n) { plt_list ret = new plt_list(); ret.add(plt_lambda.quote); ret.add(n); return(ret); }
private void button1_Click(object sender, EventArgs e) { plt_list static_env = new plt_list(); static_env.add("+", new plt_lambda_add()); string input = parsing.format_string(@"((lambda (a) (+ a 1)) 10)"); plt_node ret = parsing.make_exp(ref input); parsing.set_all_symbol_env(ret as plt_list, static_env); ret = plt_node.eval_node(ret); textBox1.Text = ret.ToString(); }
public override plt_tail eval() { if (_member.Count == 0) return plt_tail.nil; plt_node afirst = plt_node.eval_node(_member[0]); if (afirst == null) return plt_tail.nil; {//特殊的函数 //特殊情况-不解释参数 if (ReferenceEquals(afirst, plt_lambda.quote)) { if (_member.Count < 2) return plt_tail.nil; return new plt_tail(_member[1], false); } if (ReferenceEquals(afirst, plt_lambda.make_lambda)) { plt_list_lambda ret = new plt_list_lambda(); ret.arg_name = _member[1] as plt_list; ret.exp = _member[2]; return new plt_tail(ret, false); } if (ReferenceEquals(afirst, plt_lambda.cond)) { for (int i = 1; i+1 < _member.Count; i+=2) { plt_node _if = plt_node.eval_node(_member[i]); if (_if != null) { return new plt_tail(_member[i + 1], true); } } } //宏 不解释参数 plt_lambda lismacro = afirst as plt_lambda; if (lismacro != null && lismacro.ismacro) { lismacro.mix_env(this); return lismacro.eval(); } } plt_list args_eval = new plt_list(); args_eval.add(afirst); for (int i = 1; i < _member.Count; i++) { args_eval.add(plt_node.eval_node(_member[i])); } plt_lambda func = afirst as plt_lambda; if (func != null) { func.mix_env(args_eval); } return afirst.eval(); }
public static plt_node quote_node(plt_node n) { plt_list ret = new plt_list(); ret.add(plt_lambda.quote); ret.add(n); return ret; }
public override plt_tail eval() { if (_member.Count == 0) { return(plt_tail.nil); } plt_node afirst = plt_node.eval_node(_member[0]); if (afirst == null) { return(plt_tail.nil); } {//特殊的函数 //特殊情况-不解释参数 if (ReferenceEquals(afirst, plt_lambda.quote)) { if (_member.Count < 2) { return(plt_tail.nil); } return(new plt_tail(_member[1], false)); } if (ReferenceEquals(afirst, plt_lambda.make_lambda)) { plt_list_lambda ret = new plt_list_lambda(); ret.arg_name = _member[1] as plt_list; ret.exp = _member[2]; return(new plt_tail(ret, false)); } if (ReferenceEquals(afirst, plt_lambda.cond)) { for (int i = 1; i + 1 < _member.Count; i += 2) { plt_node _if = plt_node.eval_node(_member[i]); if (_if != null) { return(new plt_tail(_member[i + 1], true)); } } } //宏 不解释参数 plt_lambda lismacro = afirst as plt_lambda; if (lismacro != null && lismacro.ismacro) { lismacro.mix_env(this); return(lismacro.eval()); } } plt_list args_eval = new plt_list(); args_eval.add(afirst); for (int i = 1; i < _member.Count; i++) { args_eval.add(plt_node.eval_node(_member[i])); } plt_lambda func = afirst as plt_lambda; if (func != null) { func.mix_env(args_eval); } return(afirst.eval()); }