Fabulous.AST 0.1.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Fabulous.AST --version 0.1.0
NuGet\Install-Package Fabulous.AST -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="Fabulous.AST" Version="0.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Fabulous.AST --version 0.1.0
#r "nuget: Fabulous.AST, 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.
// Install Fabulous.AST as a Cake Addin
#addin nuget:?package=Fabulous.AST&version=0.1.0

// Install Fabulous.AST as a Cake Tool
#tool nuget:?package=Fabulous.AST&version=0.1.0

Fabulous.AST

Welcome to the Fabulous.AST, an Abstract Syntax Tree (AST) Domain Specific Language (DSL) for F#.

Fabulous.AST uses Fantomas to generate F# code from AST. This means that you can use Fabulous.AST to generate F# code that is formatted according to the Fantomas style guide. It's designed to provide a simple and expressive way to represent code as a tree of nodes. This makes it easier to manipulate and analyze code programmatically.

Let's take a look at an AST example in Fantomas:

open FSharp.Compiler.Text
open Fantomas.Core.SyntaxOak

let implementationSyntaxTree =
    Oak(
        [],
        [ ModuleOrNamespaceNode(
              None,
              [ BindingNode(
                    None,
                    None,
                    MultipleTextsNode([ SingleTextNode("let", Range.Zero) ], Range.Zero),
                    false,
                    None,
                    None,
                    Choice1Of2(IdentListNode([ IdentifierOrDot.Ident(SingleTextNode("x", Range.Zero)) ], Range.Zero)),
                    None,
                    [],
                    None,
                    SingleTextNode("=", Range.Zero),
                    Expr.Constant(Constant.FromText(SingleTextNode("12", Range.Zero))),
                    Range.Zero
                )
                |> ModuleDecl.TopLevelBinding ],
              Range.Zero
          ) ],
        Range.Zero
    )

open Fantomas.Core

CodeFormatter.FormatOakAsync(implementationSyntaxTree)
|> Async.RunSynchronously
|> printfn "%s"

produces the following code:

let x = 12

Now let's take a look at same example using Fabulous.AST:


let source = 
    AnonymousModule() { 
        Let("x", "12")
    }

open Fantomas.Core

let oak = Tree.compile source

CodeFormatter.FormatOakAsync(oak)
|> Async.RunSynchronously
|> printfn $"%s{res}"

produces the following code:

let x = 12

In this example, we have an anonymous module that contains a single let binding, which assigns the value "12" to the variable "x". The AST is represented as a series of nested function calls, starting with AnonymousModule() and ending with Let("x", "12").

Using Fabulous.AST, you can easily create and manipulate ASTs like this one using F# functions. For example, you can add new nodes to the AST, modify existing nodes, or traverse the AST to perform analysis or transformation tasks.

Fabulous.AST is a powerful tool for anyone who works with code and wants to automate or streamline their development workflow. Whether you're a compiler writer, a code generator, or just someone who wants to write better code faster, Fabulous.AST can help you achieve your goals.

Available widgets

Namespaces and modules
Widget Description F# code
AnonymousModule An anonymous module ()
Namespace A namespace namespace ABC
Module A module module ABC
NestedModule A module module ABC =
Open directives
Widget Description F# code
Open An open directive open ABC
OpenType An open directive open type ABC.XYZ
Let bindings
Widget Description F# code
Value A let binding let x = 12
Constant A constant definition [<Literal>] let x = 12
Function A function definition let f x = x + 1
Type definitions
Widget Description F# code
Alias A type definition type MyInt = int
Record A record type type R = { x: int; y: int }
Union A union type type U = A \| B of int
Class A class type type MyClass() = class end
Struct A struct type type MyStruct() = struct end
Interface An interface type type I = interface end
Control flow definitions
Widget Description F# code
If An if expression if x = 12 then 1
IfElse An if expression if x = 12 then 1 else 2
Match A match expression match x with
For A for loop for i in 1..10 do
While A while loop while x < 10 do
Product Compatible and additional computed target framework versions.
.NET 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Fabulous.AST:

Package Downloads
MigrateLib

Declarative migrations for SQLite

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.0-pre9 103 5/13/2024
1.0.0-pre8 73 5/12/2024
1.0.0-pre7 89 5/10/2024
1.0.0-pre6 71 5/10/2024
1.0.0-pre5 112 4/14/2024
1.0.0-pre4 80 4/7/2024
1.0.0-pre3 71 4/1/2024
1.0.0-pre2 89 3/27/2024
1.0.0-pre15 58 7/1/2024
1.0.0-pre14 60 6/13/2024
1.0.0-pre13 70 6/2/2024
1.0.0-pre12 145 5/20/2024
1.0.0-pre11 81 5/16/2024
1.0.0-pre10 67 5/13/2024
1.0.0-pre1 72 3/25/2024
0.9.0 105 3/12/2024
0.8.2 79 3/11/2024
0.8.1 82 3/10/2024
0.8.0 75 3/8/2024
0.7.0 194 2/11/2024
0.6.2 199 6/8/2023
0.6.1 163 6/4/2023
0.6.0 142 5/29/2023
0.5.0 173 4/21/2023
0.4.0 199 4/13/2023
0.3.0 184 4/11/2023
0.2.0 171 4/6/2023
0.1.0 196 4/3/2023

Initial release