77 lines
2.2 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|