keithlisp/doc/stdlib_forms.md

54 lines
1.8 KiB
Markdown

# Special Forms
Special forms are constructs that Keithlisp evaluates differently from
other S-expressions.
## `quote`
```
(quote form)
```
`quote` returns `form` as-is, without performing any evaluation on it.
## `cond`
```
(cond {(test {body-form}*)}*)
```
`cond` is Keithlisp's basic conditional operator. It consists of zero or
more clauses (a `test`, followed by zero or more `body-form`s).
`cond` evaluates the `test` of each clause in order. If the result is
non-nil, `cond` skips all remaining clauses, evaluates each `body-form`,
and returns the result of the last one (or the result of `test` if the
clause has no `body-form`s). Otherwise, if all `test`s evaluate to nil,
or no clauses were given, `cond` returns nil.
## `let`
```
(let ({var | (var value)}*) {body-form}*)
```
`let` defines locally scoped variables in Keithlisp. It consists of a
list of variable definitions, followed by zero or more `body-form`s.
For each variable definition, `let` evaluates `value` if it exists, and
initializes `var` to the result. If `value` does not exist, nil is used
instead. If a variable named `var` exists outside the scope of `let`, it
will be preserved in the syms-alist, but hidden underneath the locally
scoped entry.
`let` evaluates each `body-form` in sequence and returns the result of
the last one. Before returning, it removes the topmost entry for each
local variable from the syms-alist. **If a locally scoped entry was
removed manually, the outer scope's corresponding entry will be removed
if it exists.**
## `defun`
```
(defun ({arg}*) {body-form}*)
```
`defun` defines a new function in Keithlisp. It consists of a list of
argument definitions, followed by zero or more `body-form`s.
An argument definition is simply the name of the locally scoped variable
which it should be bound to. `&optional`, `&rest`, and `&key` arguments
are not yet supported.