public static SSObject Swap(SSExpression[] exps, SSScope scope) { var na = exps[0].Token.Value; var va = exps[0].Evaluate(scope); var nb = exps[1].Token.Value; var vb = exps[1].Evaluate(scope); scope.Undefine(nb); scope.Undefine(na); scope.Define(nb, va); scope.Define(na, vb); return(true); }
/// <summary> /// (rename old-name new-name) /// </summary> public static SSObject Rename(SSExpression[] exps, SSScope scope) { string oname = exps[0].Token.Value; string nname = exps[1].Token.Value; (!oname.Equals(nname)).OrThrows("same name {0}".Fmt(oname)); try { var obj = scope.Find(oname); scope.Define(nname, obj); scope.Undefine(oname); return(nname + " " + obj.ToString()); } catch (Exception) { Func <SSExpression[], SSScope, SSObject> obj = null; if (SSScope.BuiltinFunctions.TryGetValue(oname, out obj)) { SSScope.BuiltinFunctions[nname] = obj; SSScope.BuiltinFunctions.Remove(oname); return(nname + " " + obj.ToString()); } throw new Exception("cannot find {0} in scope, and it is not a builtin".Fmt(nname)); } }
/// <summary> /// set name value /// </summary> public static SSObject Set(SSExpression[] exps, SSScope scope) { (exps.Length == 2).OrThrows("expect two parameters"); var b0 = exps[0]; var b1 = exps[1].Evaluate(scope); if (!b0.Evaluate(scope).Replace(b1)) { scope.Undefine(b0.Token.Value); scope.Define(b0.Token.Value, b1); } return(b1); }
/// <summary> /// try{ /// value /// } /// catch(ex){ /// } /// </summary> public static SSObject TryCatch(SSExpression[] exps, SSScope scope) { try { return(exps[0].Evaluate(scope)); } catch (Exception ex) { var tok = exps[2].Children[0].Token; scope.Define(tok.Value, ex.Message); return(exps[3].Evaluate(scope)); } }