Documentation
¶
Overview ¶
Package gen turns a notebook's code cells into a Go program: the worker the kernel compiles and drives.
Each cell becomes a function. The names a cell defines at its top level become package-level variables — so every cell, and every function, can read them, and their values outlive the call — which needs their types: gen type-checks the cells one by one in dependency order to learn them. The cells' own text is kept, edited in place (":=" becomes "= ", a final expression is wrapped in a call that shows it), under //line directives that point back into the notebook, so the compiler's errors and a panic's stack name the notebook's lines.
Index ¶
- Constants
- func RegisterBackend(lang string, b Backend)
- func UnregisterBackend(lang string)
- type Backend
- type Code
- type Context
- func (c *Context) Cell(i int) *analysis.Cell
- func (c *Context) Code(i int) Code
- func (c *Context) Declare(v Var)
- func (c *Context) Defer(i int, reason string)
- func (c *Context) Done(i int)
- func (c *Context) FuncName(i int) string
- func (c *Context) Inputs(i int) []Var
- func (c *Context) Options() Options
- func (c *Context) Path() string
- func (c *Context) ResolveType(t string) string
- func (c *Context) Unknown(name string)
- func (c *Context) Vars() []Var
- func (c *Context) WaitsOnDeferred(i int) string
- type Diag
- type Options
- type Program
- type Var
Constants ¶
const JuliaNotRun = analysis.JuliaNotRun
JuliaNotRun is analysis.JuliaNotRun, the failure of every Julia cell. Julia is a check-only language (analysis.Run): its cells are stubs that fail with it, and the cells that read them say which cell blocks them.
const RubyModule = analysis.RubyModule
RubyModule is the module RubyPath belongs to.
const RubyPath = analysis.RubyPath
RubyPath is the import path of the package that runs Ruby cells: the go-scikit Ruby bindings' cells, over the pure-Go Ruby go-embedded-ruby.
const RuntimePath = "github.com/go-notebook/notebook/runtime"
RuntimePath is the import path of the package the program links.
Variables ¶
This section is empty.
Functions ¶
func RegisterBackend ¶ added in v0.7.0
RegisterBackend registers the Backend of a language that runs. It panics on an empty or duplicate name.
func UnregisterBackend ¶ added in v0.7.0
func UnregisterBackend(lang string)
UnregisterBackend removes a backend, for tests.
Types ¶
type Backend ¶ added in v0.7.0
type Backend interface {
// Infer declares the variables of cell i (Context.Declare), or defers it
// (Context.Defer), and marks it done (Context.Done).
Infer(c *Context, i int)
// Write writes cell k's function, named Context.FuncName(k), whose
// parameter is a *_nb.Cell: see Ruby's in ruby.go.
Write(c *Context, b *strings.Builder, k int)
// Runtime is the import name the generated program gives the language's
// package (analysis.Runtime), and the declarations that follow the
// program's variables.
Runtime() (importName, prelude string)
}
A Backend generates the code of a non-Go language's cells that run. Go cells need none; a language that does not run (analysis.Run.Runs false) is check-only and needs none either: its cells are stubs that fail with its Run.NotRun. A language that runs registers its Backend under its name (RegisterBackend), and implements analysis.Runtime for the package the program imports: no edit of gen is needed.
type Code ¶
type Code struct {
Source string
Line int
// Lang is the cell's language: "go" (or ""), "ruby" or "julia".
Lang string
}
Code is one code cell: its source and the 1-based line of the notebook where that source starts.
type Context ¶ added in v0.7.0
type Context struct {
// contains filtered or unexported fields
}
Context is what a Backend sees of the program being generated.
func (*Context) Defer ¶ added in v0.7.0
Defer defers cell i with a reason: its code is not emitted and it fails with the reason when run.
func (*Context) FuncName ¶ added in v0.7.0
FuncName is the name of cell i's function in the program.
func (*Context) Inputs ¶ added in v0.7.0
Inputs are the variables of other cells that cell i reads, in the order of its uses.
func (*Context) ResolveType ¶ added in v0.7.0
ResolveType writes a Go type, in the syntax of Options.RubyTypes ("*{github.com/go-plot/plot}.Figure"), with the program's import names; "" when it names a package the program cannot see.
func (*Context) Unknown ¶ added in v0.7.0
Unknown records that the Go type of variable name is not known yet: the Go cells that read it are deferred.
func (*Context) WaitsOnDeferred ¶ added in v0.7.0
WaitsOnDeferred says why cell i must wait for a deferred cell it reads, "" when it need not.
type Diag ¶
type Diag struct {
Cell int // -1 when it is not inside a cell
Line, Col int // in the notebook
Msg string
}
Diag is a problem in the notebook, at a cell and a position in it.
type Options ¶ added in v0.3.0
type Options struct {
// RubyTypes maps a Ruby cell's variable to the Go type its value had the
// last time the cell ran, as the cells package names it
// ("[]float64", "*{github.com/go-plot/plot}.Figure"). A Go cell sees the
// variable with that type. A variable not in it is declared any, and the
// Go cells that read it are deferred until it is known.
RubyTypes map[string]string
}
Options configure GenerateWith.
type Program ¶
type Program struct {
Source []byte
Vars []Var
Graph *analysis.Graph
// Imports maps every package the program imports (but the runtime) to
// the name it is imported under.
Imports map[string]string
// Diags are the notebook's errors. A program with diagnostics is still
// returned, but will not compile.
Diags []Diag
// Deferred maps a cell that cannot be compiled yet to why: it reads a
// Ruby cell's variable whose Go type is known only once that cell has
// run (see Options.RubyTypes). It is emitted as a stub that says so.
Deferred map[int]string
}
Program is a generated worker.
type Var ¶
type Var struct {
Name string
Type string // Go syntax, qualified with the program's import names
Cell int
// Ruby marks a Ruby cell's variable. Its Go holder is named Ident when
// its name is no Go identifier (len, type): Go cells do not see it.
Ruby bool
Ident string
}
Var is a notebook variable as the program declares it.