54 lines
1.8 KiB
Markdown
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.
|