Developers using Elk can deliver applications with different components written in different languages, such as an efficient core written in C or C++ and an extensible user interface layer implemented in Scheme. To help building hybrid application architectures, Elk supports a tightly-knit interworking of the C/C++ parts of applications with Scheme code.
Elk is also useful as a stand-alone Scheme implementation, in particular as a platform for rapid prototyping of X11-based Scheme programs.
The Elk project was started in 1987 to support ISOTEXT, a multimedia document editor that has been developed at the Technical University of Berlin. The first freely available version, Elk 1.0, was published in USENET in September 1989. Since then, Elk has been successfully used as the extension language framework for numerous applications (commercial products as well as free software projects).
The new object representation has been suggested by Craig McPheeters, who also contributed an initial set of patches. Its advantages are:
The new C/C++ Programmer's Manual is a complete specification of the C/C++ interface to Elk; it is intended for authors of extensible, Elk-based applications and for extension writers. Topics range from the general architecture of extensible applications and the use of dynamic loading to advanced techniques such as weak data structures and cooperation with the garbage collector.
Also new in Elk 3.0 is a POSIX-style regular expression extension. Elk has been ported to several new platforms (among them Linux, BSD/OS, AIX 4.1, and HP-UX 10.0). A full list of changes is in the distribution (see the text files CHANGES and MIGRATE).
Dynamic loading in Elk is supported on many platforms and is not restricted to a dlopen() interface. Elk provides automatic initialization of dynamically loaded extensions and takes care of C++ static constructors/destructors embedded in object files.
Freezing of fully customized applications into executable files. Elk provides a new Scheme primitive dump which freezes the dynamic runtime image of the Scheme interpreter into an executable file (including an enclosing application if present). This facility resembles unexec() in Emacs, but the new executable resumes execution by returning from the call to dump by which that executable was created (not unlike fork() in UNIX). Dynamic loading and dump increase the usability of Elk as the backbone of complex applications.
Powerful C/C++ interface for language interoperability. Elk provides for a tight integration of the C/C++ core of applications (or extensions) with the extension language. Applications can define their own Scheme primitives (three calling disciplines are supported), define application-specific first-class Scheme types with customized print and read functions, convert objects between Scheme types and C/C++ types in various ways, implement weak data structures, raise Scheme errors, define Scheme variables and symbols, evaluate S-expressions encoded as C strings, and utilize the garbage collector.
Full Scheme bindings for X11 and Motif. Several dynamically loadable extensions provide full Scheme access to the X11/OpenWindows Xlib, to the application programmer interface of the Xt intrinsics, and to the Athena and OSF/Motif widget sets. Using these extensions, the graphical user-interfaces of Elk-based applications can be built entirely in the extension language.
UNIX interface. Elk provides Scheme access to most UNIX system calls and common C library functions. The UNIX extension supports a wide range of different UNIX platforms without restricting its functionality to the lowest common denominator or to the POSIX 1003.1 functions.
Stop-and-copy and generational, incremental garbage collection. Elk employs two garbage collection strategies selectable at compile time: a traditional ``stop-and-copy'' garbage collector and a generational garbage collector which is more efficient and thus reduces the time the application is disrupted by a garbage collection. On platforms with advanced memory management, incremental mode can be enabled for the generational garbage collector to further reduce wait times.
Non-standard Scheme features. In addition to the standard Scheme core, Elk supports first-class environments, error handling, provide/require and autoloading, fluid bindings and dynamic-wind, simple ``eval-twice''-style macros, property lists, string ports and bidirectional ports, shell-style ``tilde expansion'' in filenames, an interactive top-level written in Scheme, a Scheme debugger and a pretty printer, arbitrary length bitstrings, and Scheme records.
Comprehensive documentation. The distribution includes 230+ pages of fully indexed documentation. All manuals exist as troff input files which can be translated to HTML (using unroff) for online browsing in addition to producing typeset-quality printed versions.
Distributed in legally unencumbered form. The copyright/license agreement permits free redistribution and use of Elk in commercial products.
Members of the Lisp language family are particularly suitable as an extension language: Lisp has a simple syntax but powerful semantics, it allows for small implementations, and its interactive nature supports rapid prototyping and encourages users to explore and test solutions to problems in an incremental way.
Consequently, Lisp has become increasingly popular for this purpose, to the point where the abundance of different dialects has grown into a problem. Of the standardized dialects of Lisp, only Scheme is suitably modest, yet sufficiently general, to serve as a reusable extension language for a wide range of applications. Scheme is orthogonal and well-defined, and it is small enough to not dominate the application it serves and to be fully understood with acceptable effort.
version of this webpage, provided by Bohdan Zograf
Portugese version of this webpage, provided by Artur Weber