XExpressions.SVG
1.0.8
See the version list below for details.
dotnet add package XExpressions.SVG --version 1.0.8
NuGet\Install-Package XExpressions.SVG -Version 1.0.8
<PackageReference Include="XExpressions.SVG" Version="1.0.8" />
paket add XExpressions.SVG --version 1.0.8
#r "nuget: XExpressions.SVG, 1.0.8"
// Install XExpressions.SVG as a Cake Addin #addin nuget:?package=XExpressions.SVG&version=1.0.8 // Install XExpressions.SVG as a Cake Tool #tool nuget:?package=XExpressions.SVG&version=1.0.8
XExpressions
A library for evaluating arbitrary expressions. For example:
Evaluator eval = new Evaluator("1 + 2");
Variant result = eval.Evaluate();
Features
Feature | Description |
---|---|
Standard Functions | A set of standard functions can be made available such as min, max etc... |
Custom Functions | Add your own functions to the expression language.<br /><br />You provide the name of the function and a delegate to invoke when it used.<br /><br />For example, you can create a function called myfunc and use it in an expression such as myfunc(10, 20, 30) * 40 |
Custom Variables/Constants | Add your own variables or constants to the expression language.<br /><br />You provide the name of the variable/constant and a delegate to retrieve the value when its used.<br /><br />For example, you create a variable called amount and use it in an expression such as amount * 0.175 |
Asynchronous (Task) Support | Delegates for custom functions/variables/constants can be async. |
Expression Tree | The expression text is broken down into a tree that can be examined or converted to an SVG to view an image of how the expression is evaluated. |
NuGet package | Available as a nuget package https://www.nuget.org/packages/XExpressions |
Basic Usage
The Evaluator
class is used to evaluate the expression. For example:
Evaluator eval = new Evaluator("1 + 2");
Variant result = eval.Evaluate();
Variant Data Type
The result of an expression is a Variant
. The variant can represent a decimal, string or boolean. For example:
Evaluator eval = new Evaluator("1 + 2 * 3 / 4");
Variant result = eval.Evaluate();
if (result.Kind == VariantKind.Decimal)
Console.WriteLine($"Result is: {(decimal)result}");
else if (result.Kind == VariantKind.String)
Console.WriteLine($"Result is: {(string)result}");
else if (result.Kind == VariantKind.Boolean)
Console.WriteLine($"Result is: {(bool)result}");
Custom Functions
To add your own functions use XExpressionsSettings
to specify the name of the function and a delegate to invoke when it is used. For example:
XExpressionsSettings settings = new XExpressionsSettings();
// Add a function called MyFunc that takes two parameters and adds them
settings.AddFunction(name: "MyFunc", parameterCount: 2,
(name, args) => args[0] + args[1]);
// Evaluate an expression using the function
Evaluator eval = new Evaluator("myfunc(100, 200)", settings);
Variant result = eval.Evaluate();
// result is 300
Custom Constants or Variables
To add your own constants or variables use XExpressionsSettings
to specify the name and a delegate to invoke when it is used. For example:
XExpressionsSettings settings = new XExpressionsSettings();
// Add a constant call pi
settings.AddIdentifier(name: "pi", (name) => 3.14);
// Add a variable called radius
settings.AddIdentifier(name: "radius", (name) => 5);
// Evaluate an expression using the constant/variable
Evaluator eval = new Evaluator("2 * pi * radius", settings);
Variant result = eval.Evaluate();
Asynchronous (Task) Support
Evaluation can be synchronous via the Evaluator.Evaluate
method or asynchronous via the Evaluator.EvaluateAsync
method. For example:
Evaluator eval = new Evaluator("1 + 2 * 3 / 4");
Variant result = await eval.EvaluateAsync();
This is particularly useful when adding custom functions/variables/constants that are also async. For example, you might add a function that calls a REST API:
XExpressionsSettings settings = new XExpressionsSettings();
// Add a function that calls a REST API
settings.AddFunction(name: "MyFunc", parameterCount: 0,
async(name, args, cancellation) =>
{
// ... call a REST API and return a result ...
});
// Evaluate the expression
Evaluator eval = new Evaluator("myfunc()");
Variant result = await eval.EvaluateAsync();
Expression Tree
The expression text is broken down into an expression tree which is then evaluated. The tree is available using the Evaluator.RootNode
property. For example:
Evaluator eval = new Evaluator("1 + 2 * 3 / 4");
// Get the tree
ExpressionNode node = eval.RootNode;
// Convert the tree into an SVG
string svg = node.CreateSvg();
The CreateSvg
method requires adding the XExpressions.SVG package.
NOTE: The SVG functionality was an after thought, is not beautiful and has its issues but is sufficient to get an understanding of what the tree looks like.
For the expression 1 + 2 * pi / 4 + min(10, 20)
the tree looks like:
<img src="docs/tree.png" width="431" height="288"/>
Example Application
The repo contains an example application that allows you to enter an expression and get a result. It also displays an image of the tree that was generated to evaluate the expression:
<img src="docs/ExampleApp.gif" width="460" height="437"/>
The example application consists of a REST API to evaluate an expression and an angular app for the user to enter the expression.
To build the application, clone the repository and run the following:
cd ExampleApp\\ClientApp
npm install
cd ..\\..
dotnet run --project ExampleApp --framework net7.0
Then navigate to http://localhost:5209 in your browser.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Microsoft.Msagl.Drawing (>= 1.1.6)
- XExpressions (>= 1.0.8)
-
net7.0
- Microsoft.Msagl.Drawing (>= 1.1.6)
- XExpressions (>= 1.0.8)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.