From 67f56f0795ac0214f9828c42f8face229e204c1d Mon Sep 17 00:00:00 2001 From: David Miller Date: Sat, 21 Feb 2009 06:55:20 +0000 Subject: ClojureCLR: added ClojureCLR project to repo. --- .../Clojure/Clojure.Console/Clojure.Console.csproj | 82 ++++++++ .../Clojure/Clojure.Console/ClojureConsole.cs | 217 +++++++++++++++++++++ .../Clojure.Console/Properties/AssemblyInfo.cs | 36 ++++ ClojureCLR/Clojure/Clojure.Console/app.config | 3 + 4 files changed, 338 insertions(+) create mode 100644 ClojureCLR/Clojure/Clojure.Console/Clojure.Console.csproj create mode 100644 ClojureCLR/Clojure/Clojure.Console/ClojureConsole.cs create mode 100644 ClojureCLR/Clojure/Clojure.Console/Properties/AssemblyInfo.cs create mode 100644 ClojureCLR/Clojure/Clojure.Console/app.config (limited to 'ClojureCLR/Clojure/Clojure.Console') diff --git a/ClojureCLR/Clojure/Clojure.Console/Clojure.Console.csproj b/ClojureCLR/Clojure/Clojure.Console/Clojure.Console.csproj new file mode 100644 index 00000000..eeaf5a07 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Console/Clojure.Console.csproj @@ -0,0 +1,82 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {4AFFC540-543E-4F56-9F49-14210D6C143A} + Exe + Properties + Clojure.Console + Clojure.Console + v3.5 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + {2AE75F5A-CD1F-4925-9647-AF4D1C282FB4} + Microsoft.Scripting.Core + + + {8B0F1074-750E-4D64-BF23-A1E0F54261E5} + Microsoft.Scripting.ExtensionAttribute + + + {EB66B766-6354-4208-A3D4-AACBDCB5C3B3} + Microsoft.Scripting + + + {B8089F66-DFBD-4906-BEE0-B317689C2524} + Clojure + + + + + + + + \ No newline at end of file diff --git a/ClojureCLR/Clojure/Clojure.Console/ClojureConsole.cs b/ClojureCLR/Clojure/Clojure.Console/ClojureConsole.cs new file mode 100644 index 00000000..f0f88869 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Console/ClojureConsole.cs @@ -0,0 +1,217 @@ +/** + * Copyright (c) David Miller. All rights reserved. + * The use and distribution terms for this software are covered by the + * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) + * which can be found in the file epl-v10.html at the root of this distribution. + * By using this software in any fashion, you are agreeing to be bound by + * the terms of this license. + * You must not remove this notice, or any other, from this software. + **/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Scripting.Hosting.Shell; +using clojure.lang; +using System.IO; +using Microsoft.Linq.Expressions; +using Microsoft.Scripting.Generation; +using Microsoft.Scripting; +using Microsoft.Scripting.Runtime; +using Microsoft.Scripting.Hosting; +using Microsoft.Scripting.Hosting.Providers; +using System.Diagnostics; +using System.Resources; +using System.Threading; + + +using clojure.runtime; +using clojure.compiler; + + +namespace clojure.console +{ + class ClojureConsole : ConsoleHost, Compiler.EEHooks + { + #region Data + + private bool _isInitialized = false; + + #endregion + + #region Convenience accessors + + private ClojureContext GetLanguageContext() + { + return (ClojureContext)HostingHelpers.GetLanguageContext(Engine); + } + + + private static SourceUnit GetSourceUnit(ScriptSource scriptSource) + { + return HostingHelpers.GetSourceUnit(scriptSource); + } + + #endregion + + #region Basic overrides + + protected override Type Provider + { + get + { + return typeof(ClojureContext); + } + } + + protected override CommandLine CreateCommandLine() + { + return new ClojureCommandLine(); + } + + #endregion + + #region Main routine + + [STAThread] + static int Main(string[] args) + { + ClojureConsole cc = new ClojureConsole(); + + int ret = cc.Run(args); + + Console.ReadLine(); + return ret; + } + + #endregion + + #region Execution override + + protected override void ExecuteInternal() + { + Debug.Assert(Engine != null); + + Var.pushThreadBindings( + RT.map(RT.CURRENT_NS, RT.CURRENT_NS.deref())); + try + { + Snippets.SetSaveAssemblies(true, "."); + MaybeInitialize(); + Snippets.SaveAndVerifyAssemblies(); + base.ExecuteInternal(); + } + catch (Exception e) + { + UnhandledException(Engine, e); + } + + finally + { + Snippets.SaveAndVerifyAssemblies(); + Var.popThreadBindings(); + } + } + + + #endregion + + #region Initialization + + private void MaybeInitialize() + { + if (_isInitialized) + return; + + _isInitialized = true; + + Compiler.SetHooks(this); + + Stopwatch sw = new Stopwatch(); + sw.Start(); + + LoadFromStream(new StringReader(clojure.properties.Resources.core)); + LoadFromStream(new StringReader(clojure.properties.Resources.core_print)); + LoadFromStream(new StringReader(clojure.properties.Resources.test)); + + sw.Stop(); + Console.WriteLine("Loading took {0} milliseconds.", sw.ElapsedMilliseconds); + + + } + + #endregion + + #region EEHooks Members + + public object Eval(object form) + { + ScriptSource scriptSource = Engine.CreateScriptSourceFromString(""); + + Expression expr = Generator.Eval(GetLanguageContext(), form); + LambdaExpression ast = Expression.Lambda(expr); + ast = new GlobalLookupRewriter().RewriteLambda(ast); + ScriptCode code = new ScriptCode(ast, GetSourceUnit(scriptSource)); + return code.Run(); + } + + public object Macroexpand1(object form) + { + return Generator.Macroexpand1(GetLanguageContext(), form); + } + + public object LoadFromStream(TextReader rdr) + { + ScriptSource scriptSource = Engine.CreateScriptSourceFromString(""); + //PushbackReader pbr = new PushbackReader(rdr); + + return LoadFromPushbackReader(scriptSource, rdr, false); + } + + public object LoadFile(string filename) + { + ScriptSource scriptSource = Engine.CreateScriptSourceFromFile(filename); + + return LoadFromPushbackReader(scriptSource, scriptSource.GetReader(), false); + } + + private static object LoadFromPushbackReader(ScriptSource scriptSource, TextReader pbr, bool addPrint) + { + object ret = null; + object eofVal = new object(); + object form; + while ((form = LispReader.read(pbr, false, eofVal, false)) != eofVal) + { + LambdaExpression ast = Generator.Generate(form, addPrint); + ast = new GlobalLookupRewriter().RewriteLambda(ast); + + ScriptCode code = new ScriptCode(ast, GetSourceUnit(scriptSource)); + ret = code.Run(); + } + + return ret; + } + + public Delegate GenerateTypedDelegate(Type delegateType, Symbol optName, IPersistentVector argList, ISeq body) + { + ScriptSource scriptSource = Engine.CreateScriptSourceFromString(""); + + LambdaExpression ast = Generator.GenerateTypedDelegateExpression(GetLanguageContext(), delegateType, optName, argList, body); + return ast.Compile(); + + //ast = new GlobalLookupRewriter().RewriteLambda(ast); -- doesn't work unless no args + //ScriptCode code = new ScriptCode(ast, GetSourceUnit(scriptSource)); + //return code; + } + + #endregion + + protected override ScriptRuntimeSetup CreateRuntimeSetup() + { + ScriptRuntimeSetup setup = base.CreateRuntimeSetup(); + setup.DebugMode = true; + return setup; + } + } +} diff --git a/ClojureCLR/Clojure/Clojure.Console/Properties/AssemblyInfo.cs b/ClojureCLR/Clojure/Clojure.Console/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..6f21300e --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Console/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Clojure.Console")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Clojure.Console")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("64eccb33-4ad4-49b4-944c-ff486ccb5ea0")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ClojureCLR/Clojure/Clojure.Console/app.config b/ClojureCLR/Clojure/Clojure.Console/app.config new file mode 100644 index 00000000..b7db2817 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Console/app.config @@ -0,0 +1,3 @@ + + + -- cgit v1.2.3-18-g5258