Giter VIP home page Giter VIP logo

Comments (5)

RobertBeekman avatar RobertBeekman commented on May 23, 2024 1

Hi, this turned out great, thank you!

img

from nostringevaluating.

KovtunV avatar KovtunV commented on May 23, 2024

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.

KovtunV avatar KovtunV commented on May 23, 2024

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.

RobertBeekman avatar RobertBeekman commented on May 23, 2024

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.

KovtunV avatar KovtunV commented on May 23, 2024

@SpoinkyNL

I've just launched

  1. v2.2.1 https://www.nuget.org/packages/NoStringEvaluating
  2. 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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.