wile

package module
v1.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 6, 2026 License: Apache-2.0 Imports: 11 Imported by: 0

README

Wile

CI Go Reference

A R7RS Scheme interpreter/compiler in Go with hygienic macros.

The name is a play on "scheme" (as in "wiles" - cunning stratagems) and a nod to Wile E. Coyote, the cartoon schemer.

Overview

Wile compiles Scheme source code to bytecode and executes it on a stack-based virtual machine. It implements R7RS-style syntax-rules and syntax-case macros with a "sets of scopes" hygiene model (Flatt 2016).

Wile is designed as a Scheme scripting layer that feels native to Go. It provides what Go intentionally lacks — hygienic macros, first-class continuations, symbolic computation — without requiring CGo, a C toolchain, or cross-compilation headaches. Add it with go get and it just works.

Background

Wile was originally a Lisp interpreter (compiler and VM) used for scripting block-based storage systems (databases, pipelines, search, etc.). It's been recently expanded to the Scheme R7RS standard in the hopes that it will be of use to someone who wants to use Lisp/Scheme in Go.

Why Another Scheme Implementation?

Existing Scheme-in-Go implementations are typically toys or subsets. Embedding a production Scheme like Chibi-Scheme or S7 requires CGo, which means slow builds, broken cross-compilation, and platform-specific toolchain pain. Wile is pure Go: Scheme values are Go heap objects collected by Go's GC, so there's no custom allocator to maintain and the GC improves for free with each Go release.

Use of AI

Anthropic's Claude Code was used to help document, fill out the primitive library, and diagnose bugs. The CLAUDE.md file is committed to help others get started.

Features

Core Language
  • R7RS-small compliance — Full conformance with all standard libraries
  • Hygienic macrossyntax-rules and syntax-case with the "sets of scopes" model (Flatt 2016)
  • First-class continuationscall/cc and dynamic-wind with proper semantics
  • Delimited continuationscall-with-continuation-prompt, abort-current-continuation, and composable continuations
  • Full numeric tower — Integers, rationals, floats, complex numbers with exact/inexact distinction
  • Arbitrary precisionBigInteger and BigFloat with automatic overflow promotion
  • Library systemdefine-library, import, export with configurable search paths
  • Recordsdefine-record-type (SRFI-9 style)
  • Promisesdelay, force, and lazy evaluation
Runtime
  • Bytecode compilation — Scheme code compiles to an efficient bytecode representation
  • Stack-based VM — Proper tail-call optimization
  • SRFI-18 threading — Threads, mutexes, and condition variables
  • Go concurrency interop — Channels, WaitGroups, RWMutex, Once, Atomic values
  • Exception handlingguard, with-exception-handler, raise
Tooling
  • Interactive REPL — Readline support with history and multi-line input
  • Source-level debugger — Breakpoints, stepping, stack traces
  • Pure Go — No CGo, no C dependencies, works with go get
  • Go embedding API — Clean API for evaluating Scheme from Go and registering Go functions as primitives

Installation

Requires Go 1.23 or later.

As a library
go get github.com/aalpar/wile@latest
As a standalone interpreter

Download a prebuilt binary from Releases, or build from source:

git clone https://github.com/aalpar/wile.git
cd wile
make build

The binary is built to ./dist/{os}/{arch}/scheme.

Usage

# Start REPL
scheme

# Run a Scheme file
scheme example.scm
scheme --file example.scm
scheme -f example.scm

# With library search path
scheme -L /path/to/libs example.scm

# Enter REPL after loading file
scheme -f example.scm -i

# Print version
scheme --version

The SCHEME_LIBRARY_PATH environment variable provides additional library search paths (colon-separated).

REPL Debugger

The REPL includes an integrated debugger. Commands start with ,:

Command Description
,break FILE:LINE Set breakpoint
,delete ID Delete breakpoint
,list List breakpoints
,step Step into next expression
,next Step over (same frame)
,finish Step out (return from function)
,continue Continue execution
,backtrace Show stack trace
,where Show current source location

Examples

Hygienic Macros
(define-syntax swap!
  (syntax-rules ()
    ((swap! x y)
     (let ((tmp x))
       (set! x y)
       (set! y tmp)))))

(let ((a 1) (b 2))
  (swap! a b)
  (list a b))
;; => (2 1)
First-Class Continuations
(call-with-current-continuation
  (lambda (exit)
    (for-each (lambda (x)
                (if (negative? x) (exit x)))
              '(54 0 37 -3 245 19))
    #t))
;; => -3
Delimited Continuations
(define tag (make-continuation-prompt-tag 'example))

(call-with-continuation-prompt
  (lambda ()
    (+ 1 (abort-current-continuation tag 42)))
  tag
  (lambda (v) (* v 2)))
;; => 84
Threads (SRFI-18)
(import (srfi 18))

(define counter 0)
(define mtx (make-mutex))

(define (increment!)
  (mutex-lock! mtx)
  (set! counter (+ counter 1))
  (mutex-unlock! mtx))

(define threads
  (map (lambda (_)
         (make-thread increment!))
       (iota 10)))

(for-each thread-start! threads)
(for-each thread-join! threads)
counter
;; => 10
Go Channels
(define ch (make-channel 10))  ; buffered channel

(channel-send! ch 42)
(channel-receive ch)
;; => 42

Embedding in Go

Wile provides a public API for embedding Scheme in Go programs via the wile package.

Basic Usage
import "github.com/aalpar/wile"

// Create an engine
engine, err := wile.NewEngine()
if err != nil {
    log.Fatal(err)
}

// Evaluate a single expression
result, err := engine.Eval(ctx, "(+ 1 2 3)")
fmt.Println(result.SchemeString()) // "6"

// Evaluate multiple expressions (returns last result)
result, err = engine.EvalMultiple(ctx, `
  (define x 10)
  (define y 20)
  (+ x y)
`)
Compile Once, Run Many Times
compiled, err := engine.Compile("(+ x 1)")
result, err := engine.Run(ctx, compiled)
Bridging Go and Scheme

Define Go values in Scheme's environment:

engine.Define("my-var", wile.NewInteger(100))
val, ok := engine.Get("my-var")

Register a Go function as a Scheme primitive:

import "github.com/aalpar/wile/values"

engine.RegisterPrimitive(wile.PrimitiveSpec{
    Name:       "go-add",
    ParamCount: 2,
    Impl: func(ctx context.Context, mc *wile.MachineContext) error {
        a := mc.Arg(0).(*values.Integer).Value
        b := mc.Arg(1).(*values.Integer).Value
        mc.SetValue(values.NewInteger(a + b))
        return nil
    },
})
// Now callable from Scheme: (go-add 3 4) => 7

Call a Scheme procedure from Go:

proc, _ := engine.Get("my-scheme-function")
result, err := engine.Call(ctx, proc, wile.NewInteger(42))
Value Constructors
Constructor Creates
wile.NewInteger(n) Exact integer
wile.NewFloat(f) Inexact real
wile.NewRational(num, den) Exact rational
wile.NewComplex(re, im) Complex number
wile.NewString(s) String
wile.NewSymbol(s) Symbol
wile.NewBoolean(b) #t / #f
wile.NewList(vals...) Proper list
wile.NewVector(vals...) Vector
wile.Null Empty list '()
wile.Void Void value
Engine Options
Option Description
wile.WithRegistry(r) Use a custom registry instead of the default core primitives
wile.WithExtension(ext) Add a single extension
wile.WithExtensions(exts...) Add multiple extensions

R7RS Standard Libraries

Library Description
(scheme base) Core language: arithmetic, pairs, lists, strings, vectors, control
(scheme case-lambda) case-lambda form
(scheme char) Character predicates and case conversion
(scheme complex) Complex number operations
(scheme cxr) Compositions of car and cdr
(scheme eval) eval and environment
(scheme file) File I/O
(scheme inexact) Transcendental functions (sin, cos, exp, log, sqrt, etc.)
(scheme lazy) Promises (delay, force, make-promise)
(scheme load) load
(scheme read) read
(scheme write) write, display
(scheme repl) interaction-environment
(scheme process-context) command-line, exit, get-environment-variable
(scheme time) current-second, current-jiffy, jiffies-per-second
(scheme r5rs) R5RS compatibility

Additional Libraries

Library Description
(srfi 18) Multithreading (threads, mutexes, condition variables)
(chibi test) Minimal test framework (for R7RS test compatibility)

Architecture

Source → Tokenizer → Parser → Expander → Compiler → VM
  1. Tokenizer — Lexical analysis with comprehensive R7RS token support
  2. Parser — Builds syntax tree with source location tracking
  3. Expander — Macro expansion using syntax-rules/syntax-case with scope sets
  4. Compiler — Generates bytecode operations
  5. VM — Executes bytecode with stack-based evaluation
Package Structure
Package Purpose
wile (root) Public embedding API
machine/ Virtual machine, compiler, macro expander
values/ Scheme value types (numbers, pairs, ports, threads, etc.)
environment/ Variable binding, scope chains, phase hierarchy
registry/ Extension registration and primitives
registry/core/ Essential primitives and bootstrap macros
registry/helpers/ Shared utilities for primitive implementations
runtime/ Compile/Run API for embedding
internal/syntax/ First-class syntax objects with scope sets
internal/match/ Pattern matching engine for macros
internal/parser/ Scheme parser
internal/tokenizer/ Lexer
internal/validate/ Syntax validation
internal/repl/ Interactive REPL with debugger
internal/bootstrap/ Environment initialization
internal/extensions/ Extension packages (io, files, math, threads, etc.)

Hygiene Model

Wile uses the "sets of scopes" approach from Flatt's 2016 paper. Each identifier carries a set of scopes, and variable resolution checks that the binding's scopes are a subset of the use site's scopes:

bindingScopes ⊆ useScopes

This prevents unintended variable capture in macros:

(define-syntax swap!
  (syntax-rules ()
    ((swap! x y)
     (let ((tmp x))    ; tmp gets macro's scope
       (set! x y)
       (set! y tmp)))))

(let ((tmp 5) (a 1) (b 2))  ; this tmp has different scope
  (swap! a b)
  tmp)  ; => 5, not captured by macro's tmp

Types

Numeric Tower
Type Description Example
Integer Exact 64-bit signed 42, -17
BigInteger Exact arbitrary precision #z12345678901234567890
Rational Exact fraction 3/4, -1/2
Float Inexact IEEE 754 double 3.14, 1e10
BigFloat Inexact arbitrary precision #m3.14159265358979323846
Complex Complex number 1+2i, 3@1.57 (polar)
Concurrency Types
Type Description
Thread SRFI-18 thread
Mutex SRFI-18 mutex
Condition Variable SRFI-18 condition variable
Channel Go channel wrapper
WaitGroup Go sync.WaitGroup wrapper
RWMutex Go sync.RWMutex wrapper
Atomic Thread-safe mutable value

Documentation

Document Description
PRIMITIVES.md Complete reference of types and primitives
docs/design/DESIGN.md Macro system design
docs/design/EMBEDDING.md Embedding API design
docs/design/DELIMITED_CONTINUATIONS.md Delimited continuation implementation
docs/dev/NUMERIC_TOWER.md Numeric tower architecture
docs/dev/ENVIRONMENT_SYSTEM.md Environment system architecture
docs/dev/R7RS_SEMANTIC_DIFFERENCES.md Documented differences from R7RS
BIBLIOGRAPHY.md Academic references
CHANGELOG.md Release history

References

License

This project is licensed under the Apache License 2.0 — see the LICENSE file for details.

Documentation

Overview

Package wile provides the public API for embedding the Wile Scheme interpreter.

Basic usage:

engine, err := wile.NewEngine()
if err != nil {
    log.Fatal(err)
}
result, err := engine.Eval(ctx, "(+ 1 2 3)")
fmt.Println(result) // 6

With extensions:

engine, err := wile.NewEngine(
    wile.WithExtension(io.Extension),
    wile.WithExtension(system.Extension),
)

Custom primitives:

engine, _ := wile.NewEngine()
engine.RegisterPrimitive(wile.PrimitiveSpec{
    Name:       "my-func",
    ParamCount: 1,
    Impl:       myFuncImpl,
})

Index

Examples

Constants

This section is empty.

Variables

View Source
var False = wrapValue(values.FalseValue)

False is the #f value.

View Source
var Null = wrapValue(values.EmptyList)

Null is the empty list.

View Source
var True = wrapValue(values.TrueValue)

True is the #t value.

View Source
var Void = wrapValue(values.Void)

Void is the void value.

Functions

This section is empty.

Types

type CompiledCode

type CompiledCode struct {
	// contains filtered or unexported fields
}

CompiledCode represents compiled Scheme code ready for execution.

func (*CompiledCode) String

func (p *CompiledCode) String() string

String returns a string representation of the compiled code.

type Engine

type Engine struct {
	// contains filtered or unexported fields
}

Engine is the main entry point for embedding Wile.

func NewEngine

func NewEngine(opts ...EngineOption) (*Engine, error)

NewEngine creates a new Wile engine. By default, only core primitives are included. Use WithExtension to add optional extensions.

Example
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aalpar/wile"
)

func main() {
	engine, err := wile.NewEngine()
	if err != nil {
		log.Fatal(err)
	}

	ctx := context.Background()
	result, err := engine.Eval(ctx, "(+ 1 2 3)")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(result.SchemeString())
}
Output:
6
Example (WithExtension)
package main

import (
	"fmt"
	"log"

	"github.com/aalpar/wile"
	"github.com/aalpar/wile/internal/extensions/io"
)

func main() {
	_, err := wile.NewEngine(
		wile.WithExtension(io.Extension),
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("engine created with I/O extension")
}
Output:
engine created with I/O extension

func (*Engine) Call

func (p *Engine) Call(ctx context.Context, proc Value, args ...Value) (Value, error)

Call invokes a Scheme procedure with arguments.

Example
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aalpar/wile"
)

func main() {
	engine, err := wile.NewEngine()
	if err != nil {
		log.Fatal(err)
	}

	// Define a Scheme function.
	ctx := context.Background()
	_, err = engine.EvalMultiple(ctx, `
		(define (square x) (* x x))
	`)
	if err != nil {
		log.Fatal(err)
	}

	// Retrieve and call it from Go.
	proc, ok := engine.Get("square")
	if !ok {
		log.Fatal("square not found")
	}

	result, err := engine.Call(ctx, proc, wile.NewInteger(12))
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(result.SchemeString())
}
Output:
144

func (*Engine) Compile

func (p *Engine) Compile(code string) (*CompiledCode, error)

Compile parses and compiles code without executing.

Example
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aalpar/wile"
)

func main() {
	engine, err := wile.NewEngine()
	if err != nil {
		log.Fatal(err)
	}

	// Define a variable, then compile an expression that uses it.
	ctx := context.Background()
	_, err = engine.Eval(ctx, "(define x 0)")
	if err != nil {
		log.Fatal(err)
	}

	compiled, err := engine.Compile("(* x x)")
	if err != nil {
		log.Fatal(err)
	}

	// Run the same compiled code with different values of x.
	for _, n := range []int64{3, 5, 7} {
		err = engine.Define("x", wile.NewInteger(n))
		if err != nil {
			log.Fatal(err)
		}

		result, err := engine.Run(ctx, compiled)
		if err != nil {
			log.Fatal(err)
		}

		fmt.Println(result.SchemeString())
	}
}
Output:
9
25
49

func (*Engine) Define

func (p *Engine) Define(name string, value Value) error

Define binds a value to a name in the top-level environment.

Example
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aalpar/wile"
)

func main() {
	engine, err := wile.NewEngine()
	if err != nil {
		log.Fatal(err)
	}

	err = engine.Define("width", wile.NewInteger(800))
	if err != nil {
		log.Fatal(err)
	}

	err = engine.Define("height", wile.NewInteger(600))
	if err != nil {
		log.Fatal(err)
	}

	ctx := context.Background()
	result, err := engine.Eval(ctx, "(* width height)")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(result.SchemeString())
}
Output:
480000

func (*Engine) Environment

func (p *Engine) Environment() *environment.EnvironmentFrame

Environment returns the underlying environment for advanced use.

func (*Engine) Eval

func (p *Engine) Eval(ctx context.Context, code string) (Value, error)

Eval parses, compiles, and executes Scheme code, returning the result.

func (*Engine) EvalMultiple

func (p *Engine) EvalMultiple(ctx context.Context, code string) (Value, error)

EvalMultiple evaluates multiple expressions, returning the last result.

Example
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aalpar/wile"
)

func main() {
	engine, err := wile.NewEngine()
	if err != nil {
		log.Fatal(err)
	}

	ctx := context.Background()
	result, err := engine.EvalMultiple(ctx, `
		(define x 10)
		(define y 20)
		(+ x y)
	`)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(result.SchemeString())
}
Output:
30

func (*Engine) Get

func (p *Engine) Get(name string) (Value, bool)

Get retrieves a value by name from the environment.

func (*Engine) RegisterPrimitive

func (p *Engine) RegisterPrimitive(spec PrimitiveSpec) error

RegisterPrimitive adds a Go function as a Scheme primitive.

Example
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aalpar/wile"
	"github.com/aalpar/wile/values"
)

func main() {
	engine, err := wile.NewEngine()
	if err != nil {
		log.Fatal(err)
	}

	// Register a Go function that doubles an integer.
	err = engine.RegisterPrimitive(wile.PrimitiveSpec{
		Name:       "double",
		ParamCount: 1,
		Impl: func(_ context.Context, mc *wile.MachineContext) error {
			n := mc.Arg(0).(*values.Integer).Value
			mc.SetValue(values.NewInteger(n * 2))
			return nil
		},
	})
	if err != nil {
		log.Fatal(err)
	}

	ctx := context.Background()
	result, err := engine.Eval(ctx, "(double 21)")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(result.SchemeString())
}
Output:
42

func (*Engine) Run

func (p *Engine) Run(ctx context.Context, cc *CompiledCode) (Value, error)

Run executes previously compiled code.

func (*Engine) TopLevelEnvironment

func (p *Engine) TopLevelEnvironment() *environment.TopLevelEnvironment

TopLevelEnvironment returns the TopLevelEnvironment for advanced use. This provides access to per-instance symbol interning and phase management.

type EngineOption

type EngineOption func(*engineConfig)

EngineOption configures an Engine.

func WithExtension

func WithExtension(ext registry.Extension) EngineOption

WithExtension adds an extension to the engine.

func WithExtensions

func WithExtensions(exts ...registry.Extension) EngineOption

WithExtensions adds multiple extensions to the engine.

func WithRegistry

func WithRegistry(r *registry.Registry) EngineOption

WithRegistry uses a custom registry instead of the default. When set, core primitives are NOT automatically added.

type Error

type Error struct {
	Message string
	Cause   error
}

Error represents a Wile engine error.

func (*Error) Error

func (p *Error) Error() string

func (*Error) Unwrap

func (p *Error) Unwrap() error

type ForeignFunction

type ForeignFunction = machine.ForeignFunction

ForeignFunction is the signature for primitive implementations. This is a re-export of machine.ForeignFunction for convenience.

type MachineContext

type MachineContext = machine.MachineContext

MachineContext provides access to the VM during primitive execution. This is a re-export of machine.MachineContext for convenience.

type PrimitiveSpec

type PrimitiveSpec = registry.PrimitiveSpec

PrimitiveSpec defines a primitive to be registered. This is a re-export of registry.PrimitiveSpec for convenience.

type Value

type Value interface {
	// SchemeString returns the Scheme representation.
	SchemeString() string
	// IsVoid returns true if this is the void value.
	IsVoid() bool
	// Internal returns the underlying values.Value for advanced use.
	// This is exported for use by testing packages and advanced embedding scenarios.
	Internal() values.Value
	// contains filtered or unexported methods
}

Value represents a Scheme value in the public API.

func NewBigFloat

func NewBigFloat(f *big.Float) Value

NewBigFloat creates a big float value from a big.Float.

func NewBigFloatFromFloat64

func NewBigFloatFromFloat64(f float64) Value

NewBigFloatFromFloat64 creates a big float value from a float64.

func NewBigFloatFromString

func NewBigFloatFromString(s string) Value

NewBigFloatFromString creates a big float from a string. Returns nil if the string is not a valid float.

func NewBigInteger

func NewBigInteger(n *big.Int) Value

NewBigInteger creates a big integer value from a big.Int.

func NewBigIntegerFromInt64

func NewBigIntegerFromInt64(n int64) Value

NewBigIntegerFromInt64 creates a big integer value from an int64.

func NewBigIntegerFromString

func NewBigIntegerFromString(s string, base int) Value

NewBigIntegerFromString creates a big integer from a string in the given base. Returns nil if the string is not a valid integer.

func NewBoolean

func NewBoolean(b bool) Value

NewBoolean creates a Scheme boolean.

func NewFloat

func NewFloat(f float64) Value

NewFloat creates a Scheme inexact real.

func NewInteger

func NewInteger(n int64) Value

NewInteger creates a Scheme integer.

func NewList

func NewList(vals ...Value) Value

NewList creates a Scheme list from values.

func NewString

func NewString(s string) Value

NewString creates a Scheme string.

func NewSymbol

func NewSymbol(s string) Value

NewSymbol creates a Scheme symbol.

Directories

Path Synopsis
Package main provides the entry point for the Wile Scheme interpreter binary.
Package main provides the entry point for the Wile Scheme interpreter binary.
Package environment provides variable binding and scoping for the Scheme compiler.
Package environment provides variable binding and scoping for the Scheme compiler.
examples
embedding command
basic demonstrates embedding the Wile Scheme interpreter in a Go program.
basic demonstrates embedding the Wile Scheme interpreter in a Go program.
internal
bootstrap
Package bootstrap initializes the top-level Scheme environment.
Package bootstrap initializes the top-level Scheme environment.
extensions/all
Package all provides additional primitives for records, promises, and extended string/character operations.
Package all provides additional primitives for records, promises, and extended string/character operations.
extensions/eval
Package eval provides evaluation and environment primitives.
Package eval provides evaluation and environment primitives.
extensions/exceptions
Package exceptions provides R7RS exception handling primitives.
Package exceptions provides R7RS exception handling primitives.
extensions/files
Package files provides file I/O primitives.
Package files provides file I/O primitives.
extensions/gointerop
Package gointerop provides Go concurrency primitive wrappers.
Package gointerop provides Go concurrency primitive wrappers.
extensions/io
Package io provides I/O primitives for reading and writing.
Package io provides I/O primitives for reading and writing.
extensions/math
Package math provides transcendental and advanced mathematical primitives.
Package math provides transcendental and advanced mathematical primitives.
extensions/system
Package system provides system interface primitives.
Package system provides system interface primitives.
extensions/threads
Package threads provides SRFI-18 multithreading primitives.
Package threads provides SRFI-18 multithreading primitives.
forms
Package forms provides a unified registry for special form handlers.
Package forms provides a unified registry for special form handlers.
match
Package match implements the pattern matching engine for syntax-rules and syntax-case.
Package match implements the pattern matching engine for syntax-rules and syntax-case.
parser
Package parser implements R7RS Scheme syntax parsing.
Package parser implements R7RS Scheme syntax parsing.
repl
Package repl provides an interactive Read-Eval-Print Loop for Wile Scheme.
Package repl provides an interactive Read-Eval-Print Loop for Wile Scheme.
schemeutil
Package schemeutil provides conversion utilities between syntax, datum, and Go types.
Package schemeutil provides conversion utilities between syntax, datum, and Go types.
syntax
Package syntax implements Scheme syntax representation with hygiene support.
Package syntax implements Scheme syntax representation with hygiene support.
tokenizer
Package tokenizer implements R7RS Scheme lexical analysis.
Package tokenizer implements R7RS Scheme lexical analysis.
validate
Package validate validates Scheme syntax and produces typed expressions.
Package validate validates Scheme syntax and produces typed expressions.
Package machine implements the Scheme virtual machine, compiler, and macro expander.
Package machine implements the Scheme virtual machine, compiler, and macro expander.
Package registry provides a plugin architecture for registering Scheme primitives.
Package registry provides a plugin architecture for registering Scheme primitives.
core
Package core provides the essential primitives required for Scheme to function.
Package core provides the essential primitives required for Scheme to function.
helpers
Package helpers provides shared utility functions for primitive implementations.
Package helpers provides shared utility functions for primitive implementations.
testhelpers
Package testhelpers provides shared test infrastructure for Scheme primitive tests.
Package testhelpers provides shared test infrastructure for Scheme primitive tests.
Package runtime provides the core API for embedding Wile Scheme in Go applications.
Package runtime provides the core API for embedding Wile Scheme in Go applications.
Package values implements all Scheme runtime value types.
Package values implements all Scheme runtime value types.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL