Tewelde.FuncScript
0.1.5
See the version list below for details.
dotnet add package Tewelde.FuncScript --version 0.1.5
NuGet\Install-Package Tewelde.FuncScript -Version 0.1.5
<PackageReference Include="Tewelde.FuncScript" Version="0.1.5" />
<PackageVersion Include="Tewelde.FuncScript" Version="0.1.5" />
<PackageReference Include="Tewelde.FuncScript" />
paket add Tewelde.FuncScript --version 0.1.5
#r "nuget: Tewelde.FuncScript, 0.1.5"
#:package Tewelde.FuncScript@0.1.5
#addin nuget:?package=Tewelde.FuncScript&version=0.1.5
#tool nuget:?package=Tewelde.FuncScript&version=0.1.5
FuncScript
FuncScript is a .NET-first expression language and runtime that lets you embed concise, functional business logic inside your applications. It ships with a parser, evaluator, formatter, CLI, unit tests, and optional SQL/GIS helpers, making it straightforward to evaluate custom scripts, map data, or compute derived values at runtime.
Highlights
- Expression-oriented language with blocks, lambdas, pattern-like switches, string templates, lists, and key-value collections.
- Batteries-included standard library covering math, logic, text, list processing, OS helpers, HTML utilities, and JSON conversion.
- Ergonomic .NET embedding via
FuncScript.Engine.Evaluate(...), strongly-typed error reporting, and deterministic formatting utilities. - Extensible through custom
IFsFunctionimplementations or ad-hoc variables injected withDefaultFsDataProvider. - Extra packages for SQL Server and NetTopologySuite geometries, plus an experimental JavaScript interpreter port.
Repository Layout
FuncScript/- core library targeting .NET 6.0; contains the parser, runtime, standard library, and data model.FuncScript.Cli/- minimal .NET 8 CLI (funcscriptcli) that evaluates expressions from the command line.FuncScript.Example/- interactive console sample that demonstrates the REPL-style usage of the runtime.FuncScript.Sql/- optional extension with SQL/geometry helpers and type normalization for ADO.NET results.FuncScript.Test/- NUnit-based test suite covering parsing, evaluation, errors, and formatting.js-port/- in-progress JavaScript port plus editor experiments and examples.
Quick Start
Prerequisites
Install the .NET 8 SDK (includes the .NET 6 tooling required by the library projects).
Build Everything
dotnet restore FuncScript.sln
dotnet build FuncScript.sln
Try the CLI
# Evaluate a simple expression
dotnet run --project FuncScript.Cli -- "(2 + 3) * 4"
# Evaluate a block with variables and built-in helpers
dotnet run --project FuncScript.Cli -- "{ rate:0.13; net:(gross)=>gross*(1-rate); return net(12500); }"
Embed in Your Application
using System;
using System.Collections.Generic;
using FuncScript;
using FuncScript.Model;
var globals = new DefaultFsDataProvider(new List<KeyValuePair<string, object>>
{
new KeyValuePair<string, object>("taxRate", 0.15),
new KeyValuePair<string, object>("format", (Func<object,string>)(value => string.Format("{0:#,#0.00}", value)))
});
var expression = "{ net:(gross)=>gross*(1-taxRate); return format(net(gross)); }";
var context = new ObjectKvc(new { gross = 5200 });
var result = FuncScript.Engine.Evaluate(new KvcProvider(context, globals), expression);
var output = new StringBuilder();
FuncScript.Engine.Format(output, result);
Console.WriteLine(output);
The runtime normalizes .NET values so that primitive types, lists, key-value collections, GUIDs, byte arrays, and even delegates translate seamlessly to script data.
Language at a Glance
Script files are case-insensitive and expression-oriented. Common constructs include:
- Blocks:
{ items:[1,2,3]; return Sum(items); } - Lambdas:
(x)=>x*xor(row, index)=>{ ... } - String templates:
f"Hello {name}!" - Collections: Lists
[1, 2, 3]and records{name:"Ada", skills:["math","logic"]} - Control:
If,Switch,Case,faultfor structured errors - Functions:
Map,Reduce,Filter,Distinct,Take,JoinText,Format,TicksToDate,point, and many more
A more elaborate example lives in FuncScript/TestFormula.text, where a payroll table is generated via mapping and HTML string templates.
Extending the Runtime
Custom functions are regular .NET classes implementing IFsFunction:
public class HexFunction : IFsFunction
{
public string Symbol => "hex";
public int MaxParsCount => 1;
public CallType CallType => CallType.Prefix;
public int Precedence => 0;
public object Evaluate(IFsDataProvider context, IParameterList parameters)
{
var value = Convert.ToInt64(parameters.GetParameter(context, 0));
return $"0x{value:X}";
}
public string ParName(int index) => "value";
}
Create a parameterless constructor, reference the assembly, and DefaultFsDataProvider.LoadFromAssembly(...) will auto-register the symbol (including optional aliases via FunctionAliasAttribute).
SQL & GIS Helpers
FuncScript.Sql adds converters for Sql* types and NetTopologySuite geometries plus GIS helpers such as point(x, y). Reference the project alongside the core library to normalize database values before exposing them to scripts.
JavaScript Port (Experimental)
The js-port/ folder contains a progressively feature-complete JavaScript interpreter that mirrors the .NET runtime. See js-port/AGENTS.md and js-port/port-progress.md for implementation notes and status.
Testing
Run the NUnit suite to ensure language changes remain backwards compatible:
dotnet test FuncScript.sln
Contributing
Issues and pull requests are welcome. If you plan substantial language or runtime changes, open an issue first so we can align on approach.
Maintainers
- Tewelde Ma. Tegegne (teweldemat@gmail.com)
License
Released under the MIT License. See LICENSE for details.
| 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 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 was computed. 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. |
-
net6.0
- Newtonsoft.Json (>= 13.0.1)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Tewelde.FuncScript:
| Package | Downloads |
|---|---|
|
Tewelde.FuncScript.Sql
SQL Server and NetTopologySuite helpers for the FuncScript runtime. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.2.27 | 317 | 12/15/2025 |
| 0.2.26 | 247 | 12/15/2025 |
| 0.2.25 | 230 | 12/15/2025 |
| 0.2.24 | 232 | 12/14/2025 |
| 0.2.23 | 362 | 11/30/2025 |
| 0.2.21 | 171 | 11/28/2025 |
| 0.2.20 | 194 | 11/27/2025 |
| 0.2.19 | 208 | 11/27/2025 |
| 0.2.18 | 206 | 11/25/2025 |
| 0.2.17 | 206 | 11/24/2025 |
| 0.2.16 | 178 | 11/23/2025 |
| 0.2.15 | 397 | 11/21/2025 |
| 0.2.14 | 414 | 11/20/2025 |
| 0.2.13 | 405 | 11/19/2025 |
| 0.2.12 | 533 | 11/19/2025 |
| 0.1.7 | 240 | 11/4/2025 |
| 0.1.6 | 208 | 11/4/2025 |
| 0.1.5 | 229 | 11/3/2025 |
| 0.1.3 | 168 | 11/1/2025 |
| 0.1.2 | 222 | 10/31/2025 |
Initial cross-platform release.