FN1
Other notable Lisp systems that use generic functions are CLOS (Common Lisp Object System), Oak Lisp, and EuLisp.
FN2
The term interpreter is used, even though most implementations of Dylan are expected to be compiled. In most cases, an interpreter will be implemented by compiling Dylan expressions and immediately executing the compiled code.
FN3
A heterarchyalso called a directed acyclic graph (DAG)is like a hierarchy, except that nodes can have multiple parents. Dylan classes are in a heterarchy because Dylan supports multiple inheritance.
FN4
A future version of Dylan may support Algol-like or other syntaxes in addition to Lisp syntax.
FN5
This is the same approach used by the Macintosh file system.
FN6
Three notable exceptions to the terminal question mark convention are <, >, and =.
FN7
The term syntax form describes both special forms and macros. They are equivalent to macros and operators in other languages.
FN8
Setter variables are not normally used for holding simple values like this. However, nothing in the language semantics prevents such uses. The example is given here, because a more realistic example would require more of the language than has been introduced so far.
FN9
define cannot be used to create lexical variables, as it can in Scheme. In Dylan, even if define appears inside another definition, the define still creates a module variable.
FN10
Other types may be supported in the future.
FN11
In the general case, reflective operations can be used to defeat module encapsulation. For example, a programmer can trace from an instance to its class by calling object-class on the instance, even if the implementor of the class did not export the variable containing the class. This problem can sometimes be solved by the proper use of sealing, which blocks many reflective operations.
FN12
In practice, an implementation may place a reasonable limit on the number of arguments that may be passed to any function.
FN13
For example, Self, and to some degree, CLOS.
FN14
The forms in this list will usually be module variables but are not required to be. An element in the superclass list can be any form that evaluates to a class.
FN15
The exact mechanism by which an indirect instance might be returned is not specified in this document.
FN16
The error also might be signaled by the method on initialize. This issue is pending.
FN17
This is in sharp distinction to some other dialects of Lisp, in which the empty-list () and the false value are the same object.
FN18
The alternate clause is not optional in Dylan.
FN19
Note: this differs from Common Lisp, where an atom may be used in place of a keylist of one element.
FN20
bind-exit is similar to the catch and throw mechanism of Common Lisp, except that it has a functional interface.
FN21
The dynamic extent restriction means that Dylan exit procedures are a subset of Schemes continuations.
FN22
Trichotomy also implies antisymmetry [if (binary< a b), then (not (binary< b a))] and antireflexivity [if (id? a b), then (not (binary< a b))]. It also implies commutativity for binary= [if (binary= a b), then (binary= b a)].
FN23
The trichotomy rule does not hold for IEEE floating-point comparisons. IEEE requires all comparison operations to return false if one of the operands is a NaN. This means that the generic Dylan equality and magnitude predicates will not be IEEE compliant.
FN24
At an implementation level, this will usually mean that the objects are pointers to the same storage or are the same immediate value. An extension is made for built-in number classes and characters. Because these objects are not mutable (i.e., cannot be changed), two with the same value will always be the same (and will thus be indistinguishable to programs).
FN25
This function accepts only two arguments because of the potential for misunderstanding the meaning for more than two arguments. With more than two arguments, its not clear whether /= should return true if any two arguments are not equal, or if none of the arguments are equal.
FN26
When methods are called directly, the method special form corresponds to the lambda special form of Lisp and to blocks in Smalltalk.
FN27
Another way to think of next-method is that it runs the method that would have been run if the current method did not exist.
FN28
A method may be removed from a generic function if it is proved that it will never be called. This will be the case if any of the objects on which the method specializes are garbage collected.
FN29
Note that the pointer from a class to its subclasses is through a weak link, so subclasses may be garbage collected if there are no other references to them.
FN30
That is, no more than two implementations are required for a function that operates on both keys and elements.
FN31
These definitions are simplified slightly for expository purposes.
FN32
The two calling possibilities are described as tail-recursive to ensure that all values returned by the call are returned by the handler. Not returning all the values could interfere with the conditions recovery protocol. A handler that really knows what it is doing could use a non-tail-recursive call, but anything that knows what its doing in this situation is probably unmodular. Note that a handler might not know the full recovery protocol, because the conditions class might be a subclass of the handlers expected type.
FN33
This is necessary to keep restart handlers available to other condition handlers.
FN34
With one exception: comparison operations may not behave in IEEE fashion when performed on NaNs.