go.starlark.net

module
v0.0.0-...-9b43f0a Latest Latest
Warning

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

Go to latest
Published: Apr 11, 2024 License: BSD-3-Clause

README

Starlark in Go

Go Tests Go Reference

This is the home of the Starlark in Go project. Starlark in Go is an interpreter for Starlark, implemented in Go. Starlark was formerly known as Skylark. The new import path for Go packages is "go.starlark.net/starlark".

Starlark is a dialect of Python intended for use as a configuration language. Like Python, it is an untyped dynamic language with high-level data types, first-class functions with lexical scope, and garbage collection. Unlike CPython, independent Starlark threads execute in parallel, so Starlark workloads scale well on parallel machines. Starlark is a small and simple language with a familiar and highly readable syntax. You can use it as an expressive notation for structured data, defining functions to eliminate repetition, or you can use it to add scripting capabilities to an existing application.

A Starlark interpreter is typically embedded within a larger application, and the application may define additional domain-specific functions and data types beyond those provided by the core language. For example, Starlark was originally developed for the Bazel build tool. Bazel uses Starlark as the notation both for its BUILD files (like Makefiles, these declare the executables, libraries, and tests in a directory) and for its macro language, through which Bazel is extended with custom logic to support new languages and compilers.

Documentation

Getting started

Build the code:

# check out the code and dependencies,
# and install interpreter in $GOPATH/bin
$ go install go.starlark.net/cmd/starlark@latest

Run the interpreter:

$ cat coins.star
coins = {
  'dime': 10,
  'nickel': 5,
  'penny': 1,
  'quarter': 25,
}
print('By name:\t' + ', '.join(sorted(coins.keys())))
print('By value:\t' + ', '.join(sorted(coins.keys(), key=coins.get)))

$ starlark coins.star
By name:	dime, nickel, penny, quarter
By value:	penny, nickel, dime, quarter

Interact with the read-eval-print loop (REPL):

$ starlark
>>> def fibonacci(n):
...    res = list(range(n))
...    for i in res[2:]:
...        res[i] = res[i-2] + res[i-1]
...    return res
...
>>> fibonacci(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>>

When you have finished, type Ctrl-D to close the REPL's input stream.

Embed the interpreter in your Go program:

import "go.starlark.net/starlark"

// Execute Starlark program in a file.
thread := &starlark.Thread{Name: "my thread"}
globals, err := starlark.ExecFile(thread, "fibonacci.star", nil, nil)
if err != nil { ... }

// Retrieve a module global.
fibonacci := globals["fibonacci"]

// Call Starlark function from Go.
v, err := starlark.Call(thread, fibonacci, starlark.Tuple{starlark.MakeInt(10)}, nil)
if err != nil { ... }
fmt.Printf("fibonacci(10) = %v\n", v) // fibonacci(10) = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

See starlark/example_test.go for more examples.

Contributing

We welcome submissions but please let us know what you're working on if you want to change or add to the Starlark repository.

Before undertaking to write something new for the Starlark project, please file an issue or claim an existing issue. All significant changes to the language or to the interpreter's Go API must be discussed before they can be accepted. This gives all participants a chance to validate the design and to avoid duplication of effort.

Despite some differences, the Go implementation of Starlark strives to match the behavior of the Java implementation used by Bazel and maintained by the Bazel team. For that reason, proposals to change the language itself should generally be directed to the Starlark site, not to the maintainers of this project. Only once there is consensus that a language change is desirable may its Go implementation proceed.

We use GitHub pull requests for contributions.

Please complete Google's contributor license agreement (CLA) before sending your first change to the project. If you are the copyright holder, you will need to agree to the individual contributor license agreement, which can be completed online. If your organization is the copyright holder, the organization will need to agree to the corporate contributor license agreement. If the copyright holder for your contribution has already completed the agreement in connection with another Google open source project, it does not need to be completed again.

Stability

We reserve the right to make breaking language and API changes at this stage in the project, although we will endeavor to keep them to a minimum. Once the Bazel team has finalized the version 1 language specification, we will be more rigorous with interface stability.

We aim to support the most recent four (go1.x) releases of the Go toolchain. For example, if the latest release is go1.20, we support it along with go1.19, go1.18, and go1.17, but not go1.16.

Credits

Starlark was designed and implemented in Java by Jon Brandvein, Alan Donovan, Laurent Le Brun, Dmitry Lomov, Vladimir Moskva, François-René Rideau, Gergely Svigruha, and Florian Weikert, standing on the shoulders of the Python community. The Go implementation was written by Alan Donovan and Jay Conrod; its scanner was derived from one written by Russ Cox.

Starlark in Go is Copyright (c) 2018 The Bazel Authors. All rights reserved.

It is provided under a 3-clause BSD license: LICENSE.

Starlark in Go is not an official Google product.

Directories

Path Synopsis
cmd
starlark
The starlark command interprets a Starlark file.
The starlark command interprets a Starlark file.
internal
chunkedfile
Package chunkedfile provides utilities for testing that source code errors are reported in the appropriate places.
Package chunkedfile provides utilities for testing that source code errors are reported in the appropriate places.
compile
Package compile defines the Starlark bytecode compiler.
Package compile defines the Starlark bytecode compiler.
spell
Package spell file defines a simple spelling checker for use in attribute errors such as "no such field .foo; did you mean .food?".
Package spell file defines a simple spelling checker for use in attribute errors such as "no such field .foo; did you mean .food?".
lib
json
Package json defines utilities for converting Starlark values to/from JSON strings.
Package json defines utilities for converting Starlark values to/from JSON strings.
math
Package math provides basic constants and mathematical functions.
Package math provides basic constants and mathematical functions.
proto
Package proto defines a module of utilities for constructing and accessing protocol messages within Starlark programs.
Package proto defines a module of utilities for constructing and accessing protocol messages within Starlark programs.
proto/cmd/star2proto
The star2proto command executes a Starlark file and prints a protocol message, which it expects to find in a module-level variable named 'result'.
The star2proto command executes a Starlark file and prints a protocol message, which it expects to find in a module-level variable named 'result'.
time
Package time provides time-related constants and functions.
Package time provides time-related constants and functions.
Package repl provides a read/eval/print loop for Starlark.
Package repl provides a read/eval/print loop for Starlark.
Package resolve defines a name-resolution pass for Starlark abstract syntax trees.
Package resolve defines a name-resolution pass for Starlark abstract syntax trees.
Package starlark provides a Starlark interpreter.
Package starlark provides a Starlark interpreter.
Package starlarkjson is an alias for go.starlark.net/lib/json to provide backwards compatibility
Package starlarkjson is an alias for go.starlark.net/lib/json to provide backwards compatibility
Package starlarkstruct defines the Starlark types 'struct' and 'module', both optional language extensions.
Package starlarkstruct defines the Starlark types 'struct' and 'module', both optional language extensions.
Package starlarktest defines utilities for testing Starlark programs.
Package starlarktest defines utilities for testing Starlark programs.
Package syntax provides a Starlark parser and abstract syntax tree.
Package syntax provides a Starlark parser and abstract syntax tree.

Jump to

Keyboard shortcuts

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