DotGram.ExpressionLanguage 0.1.0

dotnet add package DotGram.ExpressionLanguage --version 0.1.0
                    
NuGet\Install-Package DotGram.ExpressionLanguage -Version 0.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DotGram.ExpressionLanguage" Version="0.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DotGram.ExpressionLanguage" Version="0.1.0" />
                    
Directory.Packages.props
<PackageReference Include="DotGram.ExpressionLanguage" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DotGram.ExpressionLanguage --version 0.1.0
                    
#r "nuget: DotGram.ExpressionLanguage, 0.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package DotGram.ExpressionLanguage@0.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DotGram.ExpressionLanguage&version=0.1.0
                    
Install as a Cake Addin
#tool nuget:?package=DotGram.ExpressionLanguage&version=0.1.0
                    
Install as a Cake Tool

DotGram.ExpressionLanguage

A C#-style expression language written in .gram, compiled into System.Linq.Expressions trees.

It is an ordinary C# library. .Gram generated the parser into this assembly when it was compiled, so nothing here carries a parser runtime, and neither does anything that references it.

using DotGram.ExpressionLanguage;

var square = ExpressionParser.Compile<Func<int, int>>("(int x) => x * x - 1");

square(3); // 8

It reads C#'s operators, at C#'s precedence, and its literals down to the digit separator and the verbatim string. Past expressions it has typed locals, blocks, if, while, do, for, switch, try/catch/finally, throw, break, continue and return, and past the keywords it has members, calls, indexers, new with initializers, generic types, is, as, casts and checked:

var calculate = ExpressionParser.Compile<Func<int, int, int>>(
    """
    (int x, int y) =>
    {
        int sum = x + y;
        return sum * sum;
    }
    """);

calculate(2, 3); // 25

Or keep the expression tree instead of compiling it:

var expression = ExpressionParser.Parse("(double x) => x / 2.0");

Console.WriteLine(expression);   // x => (x / 2)

Or ask, rather than catch: TryParse answers for everything Parse would throw for — text that is not this language, and text that is and means nothing, such as a name nothing declares or an operator its operands do not support.

var match = ExpressionParser.TryParse("(string s) => s - 1");

match.IsSuccess;   // false: there is no minus over a string
match.Error;       // what Expression.Subtract said about String and Int32

A type named rather than spelled as a keyword is found the way C# finds one: written whole, or through a using at the top of the text. Nothing is imported unasked, System included, and a text's usings are its own — the next text starts with none. What it can name is what C# written in the calling assembly could: public types, and that assembly's own internal types and members.

var count = ExpressionParser.Compile<Func<IList<int>, int>>(
    """
    using System.Collections.Generic;

    (IList<int> l) => l.Count
    """);

Conversions, operators and overloads follow C#'s rules: x + 1.5 over an int is a double, byte b = 1 fits, and Math.Sqrt(x) finds the double overload. Where it is not C# — no generic or extension method is called, and a constant is folded only across a minus — is written down, with the reason for each, at the top of the file below.

The grammar calls System.Linq.Expressions factories directly. There is no intermediate AST specific to .Gram that must later be translated into an expression tree — which also means a factory that does not exist, or one handed the wrong type, is a C# error on the line of the grammar that asked for it rather than an exception at run time.

The grammar and the C# it calls are one file, ExpressionParser.cs.

Taking it

dotnet add package DotGram.ExpressionLanguage

There is no companion runtime package, and no generator to install alongside it: the parser was generated when this assembly was compiled.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  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 was computed.  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.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

  • net10.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.0 46 9/15/2026

First release. A C#-style expression language — C#'s operators and literals, locals, blocks, loops, switch, try, members, calls and new — read by a generated parser that calls the System.Linq.Expressions factories directly.