Header menu logo Fabulous.AST

Computation Expressions

Contents

#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fantomas.Core.dll"
#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fabulous.AST.dll"
#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fantomas.FCS.dll"

open Fabulous.AST
open type Fabulous.AST.Ast

Overview

A computation expression wraps a body in { ... }. ComputationExpr produces an anonymous block; NamedComputationExpr prefixes it with a builder name such as seq, async, or task.

Basic Usage

Oak() { AnonymousModule() { Value("block", ComputationExpr(ConstantExpr(String "a"))) } }
|> Gen.mkOak
|> Gen.run
|> printfn "%s"

// produces the following code:
let block = { "a" }

Named Computation Expressions

Pass the builder name to NamedComputationExpr:

Oak() {
    AnonymousModule() {
        Value("greeting", NamedComputationExpr("async", ConstantExpr(String "hello")))

        Value("work", NamedComputationExpr("task", ConstantExpr(String "done")))
    }
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"

// produces the following code:
let greeting = async { "hello" }
let work = task { "done" }

Multi-statement Bodies

Use CompExprBodyExpr to place several statements in the body:

Oak() {
    AnonymousModule() {
        Value("numbers", NamedComputationExpr("seq", CompExprBodyExpr([ "yield 1"; "yield 2"; "yield 3" ])))
    }
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"

// produces the following code:
let numbers =
    seq {
        yield 1
        yield 2
        yield 3
    }
namespace Fabulous
namespace Fabulous.AST
type Ast = class end
Multiple items
static member Ast.Oak: unit -> CollectionBuilder<Fantomas.Core.SyntaxOak.Oak,'marker>

--------------------
module Oak from Fabulous.AST
static member Ast.AnonymousModule: unit -> CollectionBuilder<Fantomas.Core.SyntaxOak.ModuleOrNamespaceNode,Fantomas.Core.SyntaxOak.ModuleDecl>
static member Ast.Value: name: string * value: string * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: string * value: string * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: string * value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: string * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.Value: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode>
   (+0 other overloads)
static member Ast.ComputationExpr: body: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.ComputationExpr: body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.ComputationExpr: body: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.ConstantExpr: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.ConstantExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
Multiple items
static member Ast.String: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>
static member Ast.String: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>
static member Ast.String: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>

--------------------
module String from Fabulous.AST

--------------------
module String from Microsoft.FSharp.Core
type Gen = static member mkOak: root: WidgetBuilder<'node> -> 'node static member parse: source: string -> string + 1 overload static member run: oak: Oak -> string + 1 overload
<summary> Renders a widget tree to F# source and verifies the result. <c>mkOak</c> turns the root widget into a Fantomas node (recursively building its children), <c>run</c> formats that node to source (optionally with a config), and <c>parse</c> round-trips the source back through the parser to confirm it is syntactically valid. Designed for pipeline use, e.g. <c>widget |&gt; Gen.parse</c> or <c>widget |&gt; Gen.mkOak |&gt; Gen.run |&gt; Gen.parse</c>. </summary>
static member Gen.mkOak: root: WidgetBuilder<'node> -> 'node
static member Gen.run: oak: Fantomas.Core.SyntaxOak.Oak -> string
static member Gen.run: oak: Fantomas.Core.SyntaxOak.Oak * config: Fantomas.Core.FormatConfig -> string
val printfn: format: Printf.TextWriterFormat<'T> -> 'T
static member Ast.NamedComputationExpr: name: string * body: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.NamedComputationExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.NamedComputationExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.NamedComputationExpr: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.NamedComputationExpr: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.NamedComputationExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.NamedComputationExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: WidgetBuilder<Fantomas.Core.SyntaxOak.BindingNode> seq -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: string seq -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> seq -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> seq -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: value: WidgetBuilder<Fantomas.Core.SyntaxOak.ComputationExpressionStatement> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
static member Ast.CompExprBodyExpr: values: WidgetBuilder<Fantomas.Core.SyntaxOak.ComputationExpressionStatement> seq -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>

Type something to start searching.