Skip to content

mflatt/zuo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Moved

This repo has the starting development history of Zuo, but it's now maintained at racket/racket and mirrored at racket/zuo.

Zuo: A Tiny Racket for Scripting

You should use Racket to write scripts. But what if you need something much smaller than Racket for some reason — or what if you're trying to script a build of Racket itself? Zuo is a tiny Racket with primitives for dealing with files and running processes, and it comes with a make-like embedded DSL.

Zuo is a Racket variant in the sense that program files start with #lang, and the module path after #lang determines the parsing and expansion of the file content. That's how the make-like DSL is defined, and even the base Zuo language is defined by layers of #langs. One of the early layers implements macros.

Some Example Scripts

See local/hello.zuo, local/tree.zuo, local/image.zuo, and local/main.zuo.

Building and Running Zuo

Compile zuo.c with a C compiler. No additional are files needed, other than system and C library headers. No compiler flags should be needed, although flags like -o zuo or -O2 are a good idea.

You can also use configure, make, and make install, where make targets mostly invoke a Zuo script after compiling zuo.c. If you don't use configure but compile to zuo in the current directory, then ./zuo local and ./zuo local install (omit the ./ on Windows) will do the same thing as make and make install with a default configuration.

The Zuo executable runs only modules. If you run Zuo with no command-line arguments, then it loads main.zuo. Otherwise, the first argument to Zuo is a file to run or a directory containing a main.zuo to run, and additional arguments are delivered to that Zuo program via the runtime-env procedure. Running the command ./zuo local install, for example, runs the local/main.zuo program with the argument install. Whatever initial script is run, if it has a main submodule, that submodule is also run.

Library Modules and Startup Performance

Except for the built-in zuo/kernel language module, Zuo finds languages and modules through a collection of libraries. By default, Zuo looks for a directory lib relative to the executable as the root of the library-collection tree. You can supply an alternate collection path with the -X command-line flag.

You can also create an instance of Zuo with a set of libraries embedded as a heap image. Embedding a heap image has two advantages:

  • No extra directory of library modules is necessary.

  • Zuo can start especially quickly, competitive with the fastest command-line programs.

The local/image.zuo script generates a .c file that is a copy of zuo.c plus embedded modules. By default, the zuo module and its dependencies are included, but you can specify others with ++lib. In addition, the default collection-root path is disabled in the generated copy, unless you supply --keep-collects to local/image.zuo.

When you use configure and make or ./zuo local, the default build target creates a to-run/zuo that embeds the zuo library, as well as a to-install/zuo that has the right internal path to find other libraries after make install or ./zuo local install.

You can use heap images without embedding. The dump-heap-and-exit Zuo kernel permitive creates a heap image, and a -B or --boot command-line flag for Zuo uses the given boot image on startup.

A boot image is machine-independent, whether in a stand-alone file or embedded in .c source.

Embedding Zuo in Another Application

Zuo can be embedded in a larger application, with or without an embedded boot image. To support embedding, compile zuo.c or the output of local/image.zuo with the ZUO_EMBEDDED preprocessor macro defined (to anything); the zuo.h header will be used in that case, and zuo.h should also be used by the embedding application. Documentation for the embedding API is provided as comments within zuo.h.

More Information

Install the zuo-doc directory as a package in Racket to render the documentation there.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published