deftrait

Die Funktion deftrait erzeugt Merkmale (siehe Merkmal). Sie wertet ihre beiden Argumente nicht aus. Beim ersten Argument handelt es sich um den Namen des Merkmals (ein Symbol).

Das zweite Argument ist eine eventuell leere Liste mit den Namen der Supermerkmale. Die Reihenfolge der Merkmale in dieser Liste ist nicht relevant, da Konflikte zwischen Methoden verhindert werden (siehe Merkmal).

In der Liste darf nicht ein Merkmal und eines seiner direkten oder indirekten Sub- oder Supermerkmale vorkommen. Auch darf ein und dasselbe Merkmal nicht mehrfach auftreten.

Ein Aufruf der Funktion erzeugt das gewünschte Merkmal und bindet es an den Namen. Es wird eine Ausnahme geworfen, wenn der Name bereits an einen Wert ungleich nil gebunden ist.

Im Unterschied zu Klassen (siehe Klasse) lassen sich von Merkmalen keine Instanzen erzeugen.

> (type-of (deftrait thingy ()))
trait

> (type-of thingy)
trait