(rontolisp) docs

Special Forms

Each form name in the table links to its own page, with a fuller description and a runnable example you can evaluate in your browser.

FormSyntaxDescription
quote(quote expr) or 'exprReturns the expression unevaluated
if(if cond then else?)Conditional. nil is false, everything else is true
let(let ((x 1) (y 2)) body...)Local variable bindings (parallel). A name proclaimed special (defvar/declaim) is bound dynamically instead of lexically
progv(progv symbols values body...)Dynamically bind a runtime-computed list of symbols to values for the body, restored on exit (interpreter only)
lambda(lambda (params...) body...)Anonymous function
progn(progn expr1 expr2...)Evaluate expressions in sequence, return the last
setq(setq name value ...)Assign values to variables; accepts multiple name value pairs, assigned left to right, and returns the last value
define-symbol-macro(define-symbol-macro name expansion)Define a global symbol macro: a reference to name evaluates expansion, and a setq/setf of it writes through expansion as a place. Top level only; the global sibling of symbol-macrolet
while(while test body...)Evaluate body repeatedly while test is non-nil. Returns nil
return(return value?)Non-local exit from the nearest enclosing loop (do/dolist/dotimes/loop), which evaluates to value (or nil)
unwind-protect(unwind-protect protected cleanup...)Evaluate protected and run the cleanup forms on every exit from it -- normal return, error unwind, or return/return-from (compile error under --no-gc)
defun(defun name (params...) body...)Define a function in the function namespace. Returns the function name
defmacro(defmacro name (params...) body...)Define a user macro; a call is expanded (the body runs with unevaluated argument forms bound) and the expansion is evaluated. Supports &rest/&body. Returns the name
defclass(defclass name (super?) ((slot options...)...))Define a class (static CLOS subset: single inheritance; :initarg/:initform/:reader/:accessor slot options). Returns the name
defgeneric(defgeneric name (param...))Define a generic function dispatching on its first argument. Returns the name
defmethod(defmethod name (param...) body...)Add a method to a generic function; the first parameter may carry an (var (eql literal)), class, or built-in-type specializer. Returns the name
defvar(defvar name value?)Define a global variable and proclaim it special, binding value only if name is not already bound (idempotent). With no value, leaves it unbound. Returns the name
defparameter(defparameter name value)Define a global variable and proclaim it special, always (re)binding value even if name is already bound. Returns the name
defconstant(defconstant name value)Like defparameter (rontolisp does not enforce constancy). Returns the name
function(function name) or #'nameLook up a function in the function namespace and return it as a value
defpackage(defpackage name (:use ...) (:export ...))Define a new package (a top-level, read/compile-time directive; :use and :export clauses only). Returns the name
rontolisp:async(rontolisp:async (defun ...)) or (rontolisp:async (lambda ...))Turn the wrapped defun/lambda into its asynchronous counterpart (async-defun/async-lambda) — the JavaScript-style spelling
rontolisp:async-defun(rontolisp:async-defun name (params...) body...)Define an asynchronous function: calling it starts the body eagerly and returns a future that settles with the body's value (or error)
rontolisp:async-lambda(rontolisp:async-lambda (params...) body...)Anonymous asynchronous function; each invocation returns a future
rontolisp:await(rontolisp:await value)Suspend the current asynchronous function until a future settles and return its value; a non-future passes through unchanged. Legal only in async-defun/async-lambda bodies and at top level
tagbody(tagbody tag-or-form...)Body forms with go tags: go jumps to a tag (forward or backward), falling off the end returns nil
go(go tag)Transfer control to a tag of the enclosing tagbody (compiled go is lexical, but one crossing a lambda re-enters the tagbody as a non-local exit)
catch(catch tag body...)Establish a dynamic exit point named by tag (an eq-compared runtime value): the form's value is the body's, or the value of a matching throw fired in its dynamic extent (compile error under --no-gc)
throw(throw tag result)Transfer control (and result) to the innermost active catch with an eq tag, running every intervening unwind-protect cleanup; a handler-case in between does not catch it

rontolisp is a Lisp-2 like Common Lisp: functions and variables live in separate namespaces. A bare symbol evaluates as a variable (car alone is an unbound-variable error), a symbol in call position resolves in the function namespace only (a variable named car does not shadow the function car), and a function is obtained as a value with #'name, (function name) or (symbol-function 'name). See Function Namespace and First-Class Functions.