コード例 #1
0
 // eval
 static MalVal eval_ast(MalVal ast, Dictionary <string, MalVal> env)
 {
     if (ast is MalSymbol)
     {
         MalSymbol sym = (MalSymbol)ast;
         return((MalVal)env[sym.getName()]);
     }
     else if (ast is MalList)
     {
         MalList old_lst = (MalList)ast;
         MalList new_lst = ast.list_Q() ? new MalList()
                                     : (MalList) new MalVector();
         foreach (MalVal mv in old_lst.getValue())
         {
             new_lst.conj_BANG(EVAL(mv, env));
         }
         return(new_lst);
     }
     else if (ast is MalHashMap)
     {
         var new_dict = new Dictionary <string, MalVal>();
         foreach (var entry in ((MalHashMap)ast).getValue())
         {
             new_dict.Add(entry.Key, EVAL((MalVal)entry.Value, env));
         }
         return(new MalHashMap(new_dict));
     }
     else
     {
         return(ast);
     }
 }
コード例 #2
0
ファイル: env.cs プロジェクト: csellsword/mal
 public MalVal get(MalSymbol key) {
     Env e = find(key);
     if (e == null) {
         throw new Mal.types.MalException(
                 "'" + key.getName() + "' not found");
     } else {
         return e.data[key.getName()];
     }
 }
コード例 #3
0
ファイル: env.cs プロジェクト: csellsword/mal
 public Env find(MalSymbol key) {
     if (data.ContainsKey(key.getName())) {
         return this;
     } else if (outer != null) {
         return outer.find(key);
     } else {
         return null;
     }
 }
コード例 #4
0
        // eval
        static MalVal EVAL(MalVal orig_ast, Dictionary <string, MalVal> env)
        {
            MalVal a0;

            // Console.WriteLine("EVAL: " + printer._pr_str(orig_ast, true));
            if (orig_ast is MalSymbol)
            {
                MalSymbol sym = (MalSymbol)orig_ast;
                return((MalVal)env[sym.getName()]);
            }
            else if (orig_ast is MalVector)
            {
                MalVector old_lst = (MalVector)orig_ast;
                MalVector new_lst = new MalVector();
                foreach (MalVal mv in old_lst.getValue())
                {
                    new_lst.conj_BANG(EVAL(mv, env));
                }
                return(new_lst);
            }
            else if (orig_ast is MalHashMap)
            {
                var new_dict = new Dictionary <string, MalVal>();
                foreach (var entry in ((MalHashMap)orig_ast).getValue())
                {
                    new_dict.Add(entry.Key, EVAL((MalVal)entry.Value, env));
                }
                return(new MalHashMap(new_dict));
            }
            else if (!(orig_ast is MalList))
            {
                return(orig_ast);
            }

            // apply list
            MalList ast = (MalList)orig_ast;

            if (ast.size() == 0)
            {
                return(ast);
            }
            a0 = ast[0];
            if (!(a0 is MalSymbol))
            {
                throw new Mal.types.MalError("attempt to apply on non-symbol '"
                                             + Mal.printer._pr_str(a0, true) + "'");
            }
            MalFunc f         = (MalFunc)EVAL(ast[0], env);
            MalList arguments = new MalList();

            foreach (MalVal mv in ast.rest().getValue())
            {
                arguments.conj_BANG(EVAL(mv, env));
            }
            return(f.apply(arguments));
        }
コード例 #5
0
 public static MalVal macroexpand(MalVal ast, Env env)
 {
     while (is_macro_call(ast, env))
     {
         MalSymbol a0  = (MalSymbol)((MalList)ast)[0];
         MalFunc   mac = (MalFunc)env.get(a0);
         ast = mac.apply(((MalList)ast).rest());
     }
     return(ast);
 }
コード例 #6
0
ファイル: stepA_mal.cs プロジェクト: jig/mal-fork
 // eval
 public static bool starts_with(MalVal ast, string sym)
 {
     if (ast is MalList && !(ast is MalVector))
     {
         MalList list = (MalList)ast;
         if (list.size() == 2 && list[0] is MalSymbol)
         {
             MalSymbol a0 = (MalSymbol)list[0];
             return(a0.getName() == sym);
         }
     }
     return(false);
 }
コード例 #7
0
ファイル: env.cs プロジェクト: fengb/mal-zig
            public MalVal get(MalSymbol key)
            {
                Env e = find(key);

                if (e == null)
                {
                    throw new Mal.types.MalException(
                              "'" + key.getName() + "' not found");
                }
                else
                {
                    return(e.data[key.getName()]);
                }
            }
コード例 #8
0
ファイル: env.cs プロジェクト: fengb/mal-zig
 public Env find(MalSymbol key)
 {
     if (data.ContainsKey(key.getName()))
     {
         return(this);
     }
     else if (outer != null)
     {
         return(outer.find(key));
     }
     else
     {
         return(null);
     }
 }
コード例 #9
0
ファイル: env.cs プロジェクト: csellsword/mal
 public Env set(MalSymbol key, MalVal value) {
     data[key.getName()] = value;
     return this;
 }
コード例 #10
0
ファイル: Interpreter.cs プロジェクト: ktodyruik/malcsharp
 public void SetEnv(MalSymbol symbol, MalVal value)
 {
     env.set(symbol, value);
 }
コード例 #11
0
 public Env set(MalSymbol key, MalVal value)
 {
     data[key.getName()] = value;
     return(this);
 }