Version 1
This commit is contained in:
parent
a110e71687
commit
f467d6eeae
6 changed files with 208 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -428,3 +428,4 @@ FodyWeavers.xsd
|
||||||
*.msm
|
*.msm
|
||||||
*.msp
|
*.msp
|
||||||
|
|
||||||
|
src/.github/copilot-instructions.md
|
||||||
|
|
|
||||||
25
src/cs-mic-cli.sln
Normal file
25
src/cs-mic-cli.sln
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.14.37328.6 d17.14
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-mic-cli", "cs-mic-cli\cs-mic-cli.csproj", "{D241250D-97BC-4D1F-A3B4-8A084D72DA7C}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D241250D-97BC-4D1F-A3B4-8A084D72DA7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{D241250D-97BC-4D1F-A3B4-8A084D72DA7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{D241250D-97BC-4D1F-A3B4-8A084D72DA7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{D241250D-97BC-4D1F-A3B4-8A084D72DA7C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {198FC807-9454-4AF0-BA73-30DFE9A7F7E4}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
65
src/cs-mic-cli/Functions/PrintVariables.cs
Normal file
65
src/cs-mic-cli/Functions/PrintVariables.cs
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
using CSMic;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace cs_mic_cli.Functions
|
||||||
|
{
|
||||||
|
internal class PrintVariables : ICodedFunction
|
||||||
|
{
|
||||||
|
public InputInterpreter Parent
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return "printvariables";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<FunctionArgument> ExpectedArguments
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public FunctionValue ReturnValue
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return FunctionValue.NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrintVariables(InputInterpreter parent)
|
||||||
|
{
|
||||||
|
this.Parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FunctionValue Execute(params FunctionArgument[] args)
|
||||||
|
{
|
||||||
|
int variableIndex = 1;
|
||||||
|
foreach(var variable in this.Parent.Variables)
|
||||||
|
{
|
||||||
|
var displayValue = variable.Value ?? string.Empty;
|
||||||
|
if(variable.Type == VariableType.NumericArray && variable.Value != null)
|
||||||
|
{
|
||||||
|
displayValue = string.Format("[{0}]", string.Join(", ", (decimal[])variable.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("{0}. {1} {2} = {3}", variableIndex++, variable.Type, variable.Name, displayValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FunctionValue.NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/cs-mic-cli/Options.cs
Normal file
21
src/cs-mic-cli/Options.cs
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
using CommandLine;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace cs_mic_cli
|
||||||
|
{
|
||||||
|
internal class Options
|
||||||
|
{
|
||||||
|
[Option('v', "verbose", HelpText = "Displays error messages from the parser if a soft error occurs.")]
|
||||||
|
public bool Verbose { get; set; }
|
||||||
|
|
||||||
|
[Option('i', "interactive", HelpText = "Starts an interactive session.")]
|
||||||
|
public bool Interactive { get; set; }
|
||||||
|
|
||||||
|
[Value(0)]
|
||||||
|
public required IEnumerable<string> Expression { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
77
src/cs-mic-cli/Program.cs
Normal file
77
src/cs-mic-cli/Program.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
using CommandLine;
|
||||||
|
using cs_mic_cli.Functions;
|
||||||
|
using CSMic;
|
||||||
|
using CSMic.StandardLibrary;
|
||||||
|
|
||||||
|
namespace cs_mic_cli
|
||||||
|
{
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
CommandLine.Parser.Default.ParseArguments<Options>(args)
|
||||||
|
.WithParsed(options =>
|
||||||
|
{
|
||||||
|
var fullExpression = string.Join(' ', options.Expression);
|
||||||
|
var inputInterpreter = new InputInterpreter();
|
||||||
|
|
||||||
|
Initializer.InitializeAll(inputInterpreter);
|
||||||
|
inputInterpreter.RegisterFunction(new PrintVariables(inputInterpreter));
|
||||||
|
|
||||||
|
if(!options.Verbose)
|
||||||
|
{
|
||||||
|
CSMic.Interpreter.Errors.errorStream = TextWriter.Null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(fullExpression) || options.Interactive)
|
||||||
|
{
|
||||||
|
// console mode
|
||||||
|
bool exitRequested = false;
|
||||||
|
|
||||||
|
Console.CancelKeyPress += (_, e) =>
|
||||||
|
{
|
||||||
|
e.Cancel = true;
|
||||||
|
exitRequested = true;
|
||||||
|
Console.WriteLine();
|
||||||
|
};
|
||||||
|
|
||||||
|
while (!exitRequested)
|
||||||
|
{
|
||||||
|
Console.Write("csmic> ");
|
||||||
|
|
||||||
|
fullExpression = Console.ReadLine();
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(fullExpression))
|
||||||
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Calculate(inputInterpreter, options, fullExpression);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// one-shot mode
|
||||||
|
Calculate(inputInterpreter, options, fullExpression);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<Options>(options =>
|
||||||
|
{
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Calculate(InputInterpreter inputInterpreter, Options options, string expression)
|
||||||
|
{
|
||||||
|
inputInterpreter.Interpret(expression);
|
||||||
|
|
||||||
|
Console.WriteLine(inputInterpreter.NumericValue);
|
||||||
|
if(options.Verbose)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Executed in {0:N2} ms | Variables: {1:N0}", inputInterpreter.LastExecutionTime.TotalMilliseconds, inputInterpreter.Variables.Count());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/cs-mic-cli/cs-mic-cli.csproj
Normal file
19
src/cs-mic-cli/cs-mic-cli.csproj
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<RootNamespace>cs_mic_cli</RootNamespace>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<PublishAot>true</PublishAot>
|
||||||
|
<InvariantGlobalization>true</InvariantGlobalization>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="CommandLineParser" Version="2.9.1" />
|
||||||
|
<PackageReference Include="CSMic" Version="2.1.0" />
|
||||||
|
<PackageReference Include="CSMic.StandardLibrary" Version="2.1.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue