예제 #1
0
                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);
                }
예제 #2
0
                /// <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));
                    }
                }
예제 #3
0
                /// <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);
                }