Meinst du meta-zirkuläre Evaluatoren wie in SICP? Du kannst dein eigenes DSL schreiben? Wenn Sie einen eigenen "Funktionstyp" erstellen, müssen Sie selbst darauf achten, ihn "anzuwenden".
Sie könnten beispielsweise Ihre eigene "Funktion" in C erstellen, zum Beispiel mit einer Nachschlagetabelle, die Funktionszeiger enthält, und Ganzzahlen als Funktionen verwenden. Für solche "Funktionen" müssten Sie natürlich Ihre eigene "Call" -Funktion bereitstellen:
%Vor%
Sie möchten wahrscheinlich auch etwas komplexere Funktionen aus primitiven erstellen, zum Beispiel die Verwendung von Arrays von Ints, um die sequenzielle Ausführung Ihrer "primitiven Funktionen" 1, 2, 3, ...
zu signalisieren und letztendlich eine ganz neue Sprache für sich selbst zu erfinden.
Ich denke, die frühen Assembler hatten keine Möglichkeit, aufrufbare "Makros" zu erstellen und mussten GOTO verwenden.
Sie könnten Trampolining verwenden, um Funktionsaufrufe zu simulieren. Sie könnten nur globale Variablen speichern, mit seichter Bindung vielleicht. In einer solchen Sprache wären "Funktionen" definierbar, jedoch nicht primitiver Typ.
Es ist also nicht notwendig, Funktionen in einer Sprache zu haben, obwohl es praktisch ist.
In Common Lisp defun
ist nichts anderes als ein Makro, das einen Namen und ein aufrufbares Objekt assoziiert (obwohl lambda
immer noch eingebaut ist). In AutoLisp gab es ursprünglich keinen speziellen Funktionstyp, und Funktionen wurden direkt in Anführungszeichen von s -Ausdrücken dargestellt, wobei das erste Element eine Argumente -Liste war. Sie können Ihre Funktion durch die Verwendung von cons
und list
Funktionen aus Symbolen direkt in AutoLisp erstellen:
%Vor%
Einige Sprachen (wie Python) unterstützen mehr als einen primitiven Funktionstyp, jeder mit seinem Aufrufprotokoll - nämlich Generatoren, die mehrfache Wiedereinträge und Rückgaben unterstützen (selbst wenn syntaktisch dasselbe def
Schlüsselwort verwendet wird). Sie können sich leicht eine Sprache vorstellen, mit der Sie Ihr eigenes Anrufprotokoll definieren und so neue Funktionstypen erstellen können.
Bearbeiten: Als Beispiel betrachten Sie den Umgang mit mehreren Argumenten in einem Funktionsaufruf, die Wahl zwischen automatischem Currieren oder automatischen optionalen Argumenten usw. In Common LISP sagen Sie, Sie könnten sich leicht zwei verschiedene% co_de erstellen % Makros, um die zwei aufrufenden Protokolle direkt darzustellen. Stellen Sie sich Funktionen vor, die mehrere Werte nicht über einen Klumpen von Aggregaten (Tupel, in Haskell) zurückgeben, sondern direkt in designierte Empfängervariablen / Slots. Alle sind verschiedene Arten von Funktionen.