Comments (5)
Hi, this turned out great, thank you!
from nostringevaluating.
Hello @SpoinkyNL,
for sure you can, I suggest two ways:
1) Using Ninject
public class Program
{
static async Task Main(string[] args)
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
var eval = kernel.Get<INoStringEvaluator>();
var res1 = eval.CalcNumber("5 - 36"); // -31
var res2 = eval.CalcWord("5 + \"happy\""); // !5happy!
var res3 = eval.CalcNumber("max(1; 5; 5; 3; 45; 7) - min(5; 7; 5; 2; 4)"); // 43
var res4 = eval.CalcWord("YouAre('Vitaly'; 26)"); // !Hello, Vitaly. After 10 years you will be 36 y.o.!
}
}
NinjectModule
public class NoStringNinjectModule : NinjectModule
{
public override void Load()
{
// Pooling
Bind<ObjectPool<Stack<InternalEvaluatorValue>>>()
.ToConstant(ObjectPool.Create<Stack<InternalEvaluatorValue>>())
.InSingletonScope();
Bind<ObjectPool<List<InternalEvaluatorValue>>>()
.ToConstant(ObjectPool.Create<List<InternalEvaluatorValue>>())
.InSingletonScope();
Bind<ObjectPool<ExtraTypeIdContainer>>()
.ToConstant(ObjectPool.Create<ExtraTypeIdContainer>())
.InSingletonScope();
// Parser
Bind<IFormulaCache>().To<FormulaCache>().InSingletonScope();
Bind<IFunctionReader>().To<FunctionReader>().InSingletonScope();
Bind<IFormulaParser>().To<FormulaParser>().InSingletonScope();
// Checker
Bind<IFormulaChecker>().To<FormulaChecker>().InSingletonScope();
// Evaluator
Bind<INoStringEvaluator>().To<NoStringEvaluator>().InSingletonScope();
// Options
var opt = new NoStringEvaluatorOptions().SetWordQuotationMark("!");
opt.UpdateConstants();
// If needed
InjectUserDefinedFunctions();
}
private void InjectUserDefinedFunctions()
{
var functionReader = Kernel.GetRequiredService<IFunctionReader>();
NoStringFunctionsInitializer.InitializeFunctions(functionReader, typeof(NoStringNinjectModule));
}
}
2) Using manual initialization - not recommended, but it's possible 😃
public class Program
{
static async Task Main(string[] args)
{
var evalInstance = new EvaluatorInstance();
var eval = evalInstance.Evaluator;
var res1 = eval.CalcNumber("5 - 36"); // -31
var res2 = eval.CalcWord("5 + \"happy\""); // !5happy!
var res3 = eval.CalcNumber("max(1; 5; 5; 3; 45; 7) - min(5; 7; 5; 2; 4)"); // 43
var res4 = eval.CalcWord("YouAre('Vitaly'; 26)"); // !Hello, Vitaly. After 10 years you will be 36 y.o.!
}
}
EvaluatorInstance
public class EvaluatorInstance
{
private readonly ObjectPool<Stack<InternalEvaluatorValue>> _stackPool;
private readonly ObjectPool<List<InternalEvaluatorValue>> _argsPool;
private readonly ObjectPool<ExtraTypeIdContainer> _extraTypeIdPool;
public EvaluatorInstance()
{
// Pooling
_stackPool = ObjectPool.Create<Stack<InternalEvaluatorValue>>();
_argsPool = ObjectPool.Create<List<InternalEvaluatorValue>>();
_extraTypeIdPool = ObjectPool.Create<ExtraTypeIdContainer>();
// Parser
FunctionReader = new FunctionReader();
FormulaParser = new FormulaParser(FunctionReader);
FormulaCache = new FormulaCache(FormulaParser);
// Checker
FormulaChecker = new FormulaChecker(FormulaParser);
// Evaluator
Evaluator = new NoStringEvaluator(_stackPool, _argsPool, _extraTypeIdPool, FormulaCache);
// Options
var opt = new NoStringEvaluatorOptions().SetWordQuotationMark("!");
opt.UpdateConstants();
// If needed
InitializeUserDefinedFunctions();
}
public INoStringEvaluator Evaluator { get; }
public IFunctionReader FunctionReader { get; }
public IFormulaParser FormulaParser { get; }
public IFormulaCache FormulaCache { get; }
public IFormulaChecker FormulaChecker { get; }
private void InitializeUserDefinedFunctions()
{
NoStringFunctionsInitializer.InitializeFunctions(FunctionReader, typeof(NoStringNinjectModule));
}
}
from nostringevaluating.
BTW, @SpoinkyNL, if Microsoft.Extensions.DependencyInjection dependency shouldn't be, I can split nuget and make two
- NoStringEvaluating - only evaluator with Microsoft.Extensions.ObjectPool dependency
- NoStringEvaluating.Extensions.Microsoft.DependencyInjection - extension for this IoC
Would it be good?
from nostringevaluating.
Hey, thanks for the reply and code sample!
A separate Nuget package sounds great, if it's not too much trouble.
The dependency on ObjectPool is ofcourse no problem :)
I'll be using this to power a Maths node in our node-based visual scripting system for https://github.com/Artemis-RGB/Artemis
from nostringevaluating.
@SpoinkyNL
I've just launched
- v2.2.1 https://www.nuget.org/packages/NoStringEvaluating
- Microsoft DI https://www.nuget.org/packages/NoStringEvaluating.Extensions.Microsoft.DependencyInjection
If you need anything else let me know, please 😊
Have a good day!
from nostringevaluating.
Related Issues (8)
- Some hints to improve the quality of the benchmark HOT 11
- How to implement String.Format() Functionality HOT 3
- How to calculate an expression for each row of a large data table without affecting performance HOT 9
- Evaluator.Parse() throws unexpected exceptions HOT 5
- Stack overflow during dispose HOT 2
- Null value and other improvements
- DateTime Functions HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nostringevaluating.