singrdk/base/Libraries/ProtoLisp/Engine.cs

77 lines
2.2 KiB
C#

///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
using System;
using System.Text;
using System.IO;
namespace ProtoLisp
{
class Engine
{
private Interpreter interpreter;
public Engine()
{
interpreter = new Interpreter();
}
public string EvalAll(string lispExpr, bool printEveryExpression, bool debugTrace)
{
MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes(lispExpr));
return EvalAll(stream, printEveryExpression, debugTrace);
}
public string EvalAll(Stream stream, bool printEveryExpression, bool debugTrace)
{
MemoryStream outputStream = new MemoryStream();
StreamWriter writer = new StreamWriter(outputStream);
Lexer lexer = new Lexer(stream);
PLObject lastVal = null;
try
{
PLObject obj;
while ((obj = lexer.GetExpression()) != null)
{
if (debugTrace)
{
lastVal = interpreter.Eval(obj, null, outputStream);
}
else
{
lastVal = interpreter.Eval(obj, null, null);
}
if (printEveryExpression)
{
writer.WriteLine(Interpreter.ExpressionToString(lastVal));
writer.Flush();
}
}
}
catch (Exception e)
{
writer.WriteLine("Exception caught: " + e);
}
if (!printEveryExpression)
{
writer.WriteLine(Interpreter.ExpressionToString(lastVal));
}
writer.Flush();
int length = (int)outputStream.Length;
return Encoding.ASCII.GetString(outputStream.GetBuffer(), 0, length);
}
}
}