Example #1
0
        public static object ReadPrototypeHandler(LispReader stream, char ch)
        {
            var list = stream.ReadDelimitedList("}");
            var obj  = new Prototype(AsArray(list));

            return(obj);
        }
Example #2
0
        public static object ReadVectorHandler2(LispReader stream, string ch, int arg)
        {
            if (stream.ReadChar() != '(')
            {
                throw stream.MakeScannerException("Invalid #() expression");
            }
            var list = stream.ReadDelimitedList(")");
            var obj  = new Vector();

            obj.AddRange(list);
            if (arg == -1)
            {
                // default no action
            }
            else if (arg < obj.Count)
            {
                throw new LispException("Vector {0} contains more than {1} items", ToPrintString(obj), arg);
            }
            else if (arg > obj.Count)
            {
                var filler = obj.Count == 0 ? (object)null : obj[obj.Count - 1];
                while (obj.Count < arg)
                {
                    obj.Add(filler);
                }
            }
            return(obj);
        }
Example #3
0
        public static object ReadQuasiQuoteHandler(LispReader stream, char ch)
        {
            var exp1 = stream.Read();
            var exp2 = QuasiQuoteExpandRest(exp1);

            return(exp2);
        }
Example #4
0
        public static object ReadNumberHandler(LispReader stream, string ch, int arg)
        {
            var token = stream.ReadToken();

            switch (ch)
            {
            case "r":
            {
                return(Number.ParseNumberBase(token, arg));
            }

            case "o":
            {
                return(Number.ParseNumberBase(token, 8));
            }

            case "b":
            {
                return(Number.ParseNumberBase(token, 2));
            }

            case "x":
            {
                return(Number.ParseNumberBase(token, 16));
            }

            default:
            {
                // not reached
                return(null);
            }
            }
        }
Example #5
0
        public static object ReadIfExprHandler(LispReader stream, string ch, int arg)
        {
            Vector branch = null;
            var    term   = ReadBranch(stream, true, BranchMode.Eval, ref branch);

            while (term == Symbols.HashElif)
            {
                var haveBranch = branch != null;
                term = ReadBranch(stream, true, haveBranch ? BranchMode.False : BranchMode.Eval, ref branch);
            }
            if (term == Symbols.HashElse)
            {
                var haveBranch = branch != null;
                term = ReadBranch(stream, false, haveBranch ? BranchMode.False : BranchMode.True, ref branch);
            }
            if (term != Symbols.HashEndif)
            {
                throw stream.MakeScannerException("EOF: Missing #endif");
            }

            if (branch != null && branch.Count > 0)
            {
                return(MakeListStar(Symbols.CompileTimeBranch, branch));
            }
            else
            {
                return(VOID.Value);
            }
        }
Example #6
0
        public static object ReadVectorHandler(LispReader stream, char ch)
        {
            var list = stream.ReadDelimitedList("]");
            var obj  = new Vector();

            obj.AddRange(list);
            return(obj);
        }
Example #7
0
        public static object ReadCharacterHandler(LispReader stream, string ch, int arg)
        {
            stream.UnreadChar();
            var name = MakeString(stream.Read());
            var chr  = DecodeCharacterName(name);

            return(chr);
        }
Example #8
0
        public static object ReadStructHandler(LispReader stream, string ch, int arg)
        {
            if (stream.ReadChar() != '(')
            {
                throw stream.MakeScannerException("Invalid #s() expression");
            }
            var list = stream.ReadDelimitedList(")");
            var obj  = new Prototype(AsArray(list));

            return(obj);
        }
Example #9
0
        public static Symbol ReadBranch(LispReader stream, bool hasTest, BranchMode mode, ref Vector branch)
        {
            var haveFeatures = false;

            if (hasTest)
            {
                var test = stream.Read();
                switch (mode)
                {
                case BranchMode.False:
                {
                    haveFeatures = false;
                    break;
                }

                case BranchMode.True:
                {
                    haveFeatures = true;
                    break;
                }

                case BranchMode.Eval:
                default:
                {
                    haveFeatures = EvalFeatureExpr(test);
                    break;
                }
                }
            }
            else
            {
                haveFeatures = mode == BranchMode.True;
            }

            if (haveFeatures)
            {
                branch = new Vector();
            }

            while (true)
            {
                var obj = haveFeatures ? stream.Read() : stream.ReadSuppressed();

                if (obj == Symbols.HashElif || obj == Symbols.HashElse || obj == Symbols.HashEndif)
                {
                    return((Symbol)obj);
                }
                else if (haveFeatures)
                {
                    branch.Add(obj);
                }
            }
        }
Example #10
0
        public static object ReadComplexNumberHandler(LispReader stream, string ch, int arg)
        {
            if (stream.ReadChar() != '(')
            {
                throw stream.MakeScannerException("Invalid #c expression");
            }
            var    nums  = stream.ReadDelimitedList(")");
            int    count = Length(nums);
            double real  = count >= 1 ? AsDouble(nums.Car) : 0;
            double imag  = count >= 2 ? AsDouble(nums.Cdr.Car) : 0;

            return(new Complex(real, imag));
        }
Example #11
0
        public static object ReadCommaHandler(LispReader stream, char ch)
        {
            var ch2 = stream.ReadChar();

            if (ch2 == '@' || ch2 == '.')
            {
                // Destructive splicing is handled as ordinary splicing
                return(MakeList(Symbols.UnquoteSplicing, stream.Read()));
            }
            else
            {
                stream.UnreadChar();
                return(MakeList(Symbols.Unquote, stream.Read()));
            }
        }
Example #12
0
        public static object ReadPlusExprHandler(LispReader stream, string ch, int arg)
        {
            object test         = stream.Read();
            bool   haveFeatures = EvalFeatureExpr(test);

            if (!haveFeatures)
            {
                stream.ReadSuppressed();
                return(VOID.Value);
            }
            else
            {
                return(stream.Read());
            }
        }
Example #13
0
        public static object ReadExecuteHandler(LispReader stream, string ch, int arg)
        {
            var expr     = stream.Read();
            var readEval = GetDynamic(Symbols.ReadEval);

            if (readEval == null)
            {
                readEval = false; //stream.loading;
            }
            if (!ToBool(readEval))
            {
                throw stream.MakeScannerException("Invalid use of '#.' (prohibited by $read-eval variable)");
            }
            var value = Eval(expr);

            return(value);
        }
Example #14
0
        public static object ReadIfExprHandler(LispReader stream, string ch, int arg)
        {
            Vector branch = null;
            var term = ReadBranch(stream, true, BranchMode.Eval, ref branch);
            while (term == Symbols.HashElif)
            {
                var haveBranch = branch != null;
                term = ReadBranch(stream, true, haveBranch ? BranchMode.False : BranchMode.Eval, ref branch);
            }
            if (term == Symbols.HashElse)
            {
                var haveBranch = branch != null;
                term = ReadBranch(stream, false, haveBranch ? BranchMode.False : BranchMode.True, ref branch);
            }
            if (term != Symbols.HashEndif)
            {
                throw stream.MakeScannerException("EOF: Missing #endif");
            }

            if (branch != null && branch.Count > 0)
            {
                return MakeListStar(Symbols.CompileTimeBranch, branch);
            }
            else
            {
                return VOID.Value;
            }
        }
Example #15
0
 public static object ReadInfixHandler(LispReader stream, string ch, int arg)
 {
     return stream.ParseInfixExpression();
 }
Example #16
0
 public static object ReadStringHandler(LispReader stream, char ch)
 {
     // C# string "...."
     return(ParseInterpolateString(stream.ParseString()));
 }
Example #17
0
 public static object ReadShortLambdaExpressionHandler(LispReader stream, string ch, int arg)
 {
     // put '(' back syncing with ReadQuasiQuoteLambdaExpressionHandler
     stream.UnreadChar();
     return(stream.ParseShortLambdaExpression(false, ")"));
 }
Example #18
0
 public static object ReadEndifExprHandler(LispReader stream, string ch, int arg)
 {
     return Symbols.HashEndif;
 }
Example #19
0
        public static object ReadNumberHandler(LispReader stream, string ch, int arg)
        {
            var token = stream.ReadToken();

            switch (ch)
            {
                case "r":
                    {
                        return Number.ParseNumberBase(token, arg);
                    }
                case "o":
                    {
                        return Number.ParseNumberBase(token, 8);
                    }
                case "b":
                    {
                        return Number.ParseNumberBase(token, 2);
                    }
                case "x":
                    {
                        return Number.ParseNumberBase(token, 16);
                    }
                default:
                    {
                        // not reached
                        return null;
                    }
            }
        }
Example #20
0
 public static object ReadExecuteHandler(LispReader stream, string ch, int arg)
 {
     var expr = stream.Read();
     var readEval = GetDynamic(Symbols.ReadEval);
     if (readEval == null)
     {
         readEval = false; //stream.loading;
     }
     if (!ToBool(readEval))
     {
         throw stream.MakeScannerException("Invalid use of '#.' (prohibited by $read-eval variable)");
     }
     var value = Eval(expr);
     return value;
 }
Example #21
0
 public static object ReadLineCommentHandler(LispReader stream, char ch)
 {
     // ;
     stream.ReadLine();
     return VOID.Value;
 }
Example #22
0
 public static object ReadQuasiQuoteLambdaExpressionHandler(LispReader stream, string ch, int arg)
 {
     return stream.ParseShortLambdaExpression(true, ")");
 }
Example #23
0
 public static object ReadLineCommentHandler2(LispReader stream, string ch, int arg)
 {
     // #!
     stream.ReadLine();
     return VOID.Value;
 }
Example #24
0
 public static object ReadQuasiQuoteHandler(LispReader stream, char ch)
 {
     var exp1 = stream.Read();
     var exp2 = QuasiQuoteExpandRest(exp1);
     return exp2;
 }
Example #25
0
 public static object ReadPrototypeHandler(LispReader stream, char ch)
 {
     var list = stream.ReadDelimitedList("}");
     var obj = new Prototype(AsArray(list));
     return obj;
 }
Example #26
0
 public static object ReadPlusExprHandler(LispReader stream, string ch, int arg)
 {
     object test = stream.Read();
     bool haveFeatures = EvalFeatureExpr(test);
     if (!haveFeatures)
     {
         stream.ReadSuppressed();
         return VOID.Value;
     }
     else
     {
         return stream.Read();
     }
 }
Example #27
0
        public static Symbol ReadBranch(LispReader stream, bool hasTest, BranchMode mode, ref Vector branch)
        {
            var haveFeatures = false;

            if (hasTest)
            {
                var test = stream.Read();
                switch (mode)
                {
                    case BranchMode.False:
                        {
                            haveFeatures = false;
                            break;
                        }
                    case BranchMode.True:
                        {
                            haveFeatures = true;
                            break;
                        }
                    case BranchMode.Eval:
                    default:
                        {
                            haveFeatures = EvalFeatureExpr(test);
                            break;
                        }
                }
            }
            else
            {
                haveFeatures = mode == BranchMode.True;
            }

            if (haveFeatures)
            {
                branch = new Vector();
            }

            while (true)
            {
                var obj = haveFeatures ? stream.Read() : stream.ReadSuppressed();

                if (obj == Symbols.HashElif || obj == Symbols.HashElse || obj == Symbols.HashEndif)
                {
                    return (Symbol)obj;
                }
                else if (haveFeatures)
                {
                    branch.Add(obj);
                }
            }
        }
Example #28
0
 public static object ReadLineCommentHandler(LispReader stream, char ch)
 {
     // ;
     stream.ReadLine();
     return(VOID.Value);
 }
Example #29
0
 public static object ReadExprCommentHandler(LispReader stream, string ch, int arg)
 {
     stream.ReadSuppressed();
     return VOID.Value;
 }
Example #30
0
 public static object ReadListHandler(LispReader stream, char ch)
 {
     return(stream.ReadDelimitedList(")"));
 }
Example #31
0
 public static object ReadQuoteHandler(LispReader stream, char ch)
 {
     return MakeList(Symbols.Quote, stream.Read());
 }
Example #32
0
 public static object ReadListHandler(LispReader stream, char ch)
 {
     return stream.ReadDelimitedList(")");
 }
Example #33
0
 public static object ReadEndifExprHandler(LispReader stream, string ch, int arg)
 {
     return(Symbols.HashEndif);
 }
Example #34
0
 public static object ReadRegexHandler(LispReader stream, string ch, int arg)
 {
     var rx = stream.ParseRegexString(ch[0]);
     return rx;
 }
Example #35
0
 public static object ReadExprCommentHandler(LispReader stream, string ch, int arg)
 {
     stream.ReadSuppressed();
     return(VOID.Value);
 }
Example #36
0
 public static object ReadShortLambdaExpressionHandler(LispReader stream, string ch, int arg)
 {
     // put '(' back syncing with ReadQuasiQuoteLambdaExpressionHandler
     stream.UnreadChar();
     return stream.ParseShortLambdaExpression(false, ")");
 }
Example #37
0
 public static object ReadInfixHandler(LispReader stream, string ch, int arg)
 {
     return(stream.ParseInfixExpression());
 }
Example #38
0
 public static object ReadSpecialStringHandler(LispReader stream, string ch, int arg)
 {
     var str = stream.ParseSpecialString();
     return str;
 }
Example #39
0
 public static object ReadLineCommentHandler2(LispReader stream, string ch, int arg)
 {
     // #!
     stream.ReadLine();
     return(VOID.Value);
 }
Example #40
0
        public static object ReadCommaHandler(LispReader stream, char ch)
        {
            var ch2 = stream.ReadChar();

            if (ch2 == '@' || ch2 == '.')
            {
                // Destructive splicing is handled as ordinary splicing
                return MakeList(Symbols.UnquoteSplicing, stream.Read());
            }
            else
            {
                stream.UnreadChar();
                return MakeList(Symbols.Unquote, stream.Read());
            }
        }
Example #41
0
 public static object ReadQuoteHandler(LispReader stream, char ch)
 {
     return(MakeList(Symbols.Quote, stream.Read()));
 }
Example #42
0
 public static object ReadComplexNumberHandler(LispReader stream, string ch, int arg)
 {
     if (stream.ReadChar() != '(')
     {
         throw stream.MakeScannerException("Invalid #c expression");
     }
     var nums = stream.ReadDelimitedList(")");
     int count = Length(nums);
     double real = count >= 1 ? AsDouble(nums.Car) : 0;
     double imag = count >= 2 ? AsDouble(nums.Cdr.Car) : 0;
     return new Complex(real, imag);
 }
Example #43
0
 public static object ReadStringHandler(LispReader stream, char ch)
 {
     // C# string "...."
     return ParseInterpolateString(stream.ParseString());
 }
Example #44
0
 public static object ReadCharacterHandler(LispReader stream, string ch, int arg)
 {
     stream.UnreadChar();
     var name = MakeString(stream.Read());
     var chr = DecodeCharacterName(name);
     return chr;
 }
Example #45
0
 public static object ReadQuasiQuoteLambdaExpressionHandler(LispReader stream, string ch, int arg)
 {
     return(stream.ParseShortLambdaExpression(true, ")"));
 }
Example #46
0
 public static object ReadStringHandler2(LispReader stream, string ch, int arg)
 {
     // C# string @"..."
     return ParseInterpolateString(stream.ParseMultiLineString());
 }
Example #47
0
        public static object ReadRegexHandler(LispReader stream, string ch, int arg)
        {
            var rx = stream.ParseRegexString(ch[0]);

            return(rx);
        }
Example #48
0
 public static object ReadStructHandler(LispReader stream, string ch, int arg)
 {
     if (stream.ReadChar() != '(')
     {
         throw stream.MakeScannerException("Invalid #s() expression");
     }
     var list = stream.ReadDelimitedList(")");
     var obj = new Prototype(AsArray(list));
     return obj;
 }
Example #49
0
        public static object ReadSpecialStringHandler(LispReader stream, string ch, int arg)
        {
            var str = stream.ParseSpecialString();

            return(str);
        }
Example #50
0
 public static object ReadUninternedSymbolHandler(LispReader stream, string ch, int arg)
 {
     throw stream.MakeScannerException("Uninterned symbols are not supported.");
 }
Example #51
0
 public static object ReadStringHandler2(LispReader stream, string ch, int arg)
 {
     // C# string @"..."
     return(ParseInterpolateString(stream.ParseMultiLineString()));
 }
Example #52
0
 public static object ReadVectorHandler(LispReader stream, char ch)
 {
     var list = stream.ReadDelimitedList("]");
     var obj = new Vector();
     obj.AddRange(list);
     return obj;
 }
Example #53
0
 public static object ReadUninternedSymbolHandler(LispReader stream, string ch, int arg)
 {
     throw stream.MakeScannerException("Uninterned symbols are not supported.");
 }
Example #54
0
 public static object ReadVectorHandler2(LispReader stream, string ch, int arg)
 {
     if (stream.ReadChar() != '(')
     {
         throw stream.MakeScannerException("Invalid #() expression");
     }
     var list = stream.ReadDelimitedList(")");
     var obj = new Vector();
     obj.AddRange(list);
     if (arg == -1)
     {
         // default no action
     }
     else if (arg < obj.Count)
     {
         throw new LispException("Vector {0} contains more than {1} items", ToPrintString(obj), arg);
     }
     else if (arg > obj.Count)
     {
         var filler = obj.Count == 0 ? (object)null : obj[obj.Count - 1];
         while (obj.Count < arg)
         {
             obj.Add(filler);
         }
     }
     return obj;
 }
Example #55
0
 public static object ReadBlockCommentHandler(LispReader stream, string ch, int arg)
 {
     // Nested comments are allowed.
     stream.ReadBlockComment("#|", "|#");
     return(VOID.Value);
 }
Example #56
0
 public static object ReadBlockCommentHandler(LispReader stream, string ch, int arg)
 {
     // Nested comments are allowed.
     stream.ReadBlockComment("#|", "|#");
     return VOID.Value;
 }