Beispiel #1
0
        public ILispValue Lookup(Symbol name)
        {
            ILispValue value;

            if (!_Variables.TryGetValue(name, out value))
            {
                return(_ParentEnvironment.Lookup(name));
            }
            return(value);
        }
Beispiel #2
0
        private static ILispValue EvaluateInvocation(Symbol funcName, IList <ILispValue> args, ILispEnvironment environment)
        {
            ILispValue func = environment.Lookup(funcName);

            if (func.Type != LispValueType.Lambda)
            {
                throw new TypeMismatchException(new Symbol("function"), LispValueType.Lambda, func.Type);
            }

            ILispLambda        lambda          = (ILispLambda)func;
            IList <ILispValue> parameterValues = args.Select(arg => Evaluate(arg, environment)).ToList();

            return(lambda.Execute(BindParameters(lambda, parameterValues)));
        }
Beispiel #3
0
        public static ILispValue Evaluate(ILispValue value, ILispEnvironment environment)
        {
            switch (value.Type)
            {
            case LispValueType.Boolean:
            case LispValueType.Char:
            case LispValueType.Lambda:
            case LispValueType.Number:
            case LispValueType.String:
            default:
                return(value);

            case LispValueType.Symbol:
                return(environment.Lookup((Symbol)value));

            case LispValueType.List:
                return(EvaluateList((List)value, environment));
            }
        }