Gibt es in Common Lisp eine Funktion in der Standardbibliothek, die einfach den angegebenen Parameter zurückgibt (d. h. die Daten nicht manipuliert)? Diese Funktion entspricht (lambda (x) x)
. Ich möchte es als Standard für einen optionalen Parameter verwenden. Eine solche Funktion würde beispielsweise (lambda (x) x)
in:
Schauen Sie sich identity
:
Funktion IDENTITY
Syntax:
Identität Objekt & amp; Rightarrow; Objekt
Argumente und Werte:
Objekt -an Objekt .
Beschreibung:
Gibt sein Argument Objekt zurück.
BTW, der ANSI CL-Standard spezifiziert fast tausend Symbole. Du kannst sie nicht alle über Nacht lernen. Lisp ist auch eine Sprache mit einer reichen Geschichte. Wenn Sie etwas "Allzweck" wollen, besteht die Chance, dass entweder die Sprache dies bietet oder eine (Semi-) Standard-Bibliothek.
Frag 'weg! Erfinde das Fahrrad nicht neu.
Die Antwort von sds beschreibt die Funktion identity , die die von Ihnen geforderte Spezifikation erfüllt: es ist ziemlich einfach (lambda (x) x)
. Es ist jedoch erwähnenswert, dass in einer Funktion wie
es könnte idiomatischer sein, Ihre Umwandlung als Schlüssel zu beschreiben und nil dies anzuzeigen Auf den Wert sollte keine Schlüsselfunktion angewendet werden. Dieses Verhalten ist in vielen Common Lisp-Funktionen vorhanden. Zum Beispiel verwendet Mitglied ein Schlüsselargument, das auf jedes Element der Sequenz angewendet wird, um einen Wert zu erzeugen, der mit dem Objekt verglichen wird, nach dem gesucht wird:
%Vor%Das Standardverhalten ist dasselbe wie wenn Sie identity als Schlüssel übergeben:
%Vor%Der Standardwert ist jedoch nicht Identität , sondern null . Die HyperSpec für Mitglied sagt über den Schlüssel:
key - ein Bezeichner für eine Funktion eines Arguments oder nil .
Dies ist in 17.2.1 Befriedigung eines Zwei-Argument-Tests angegeben das:
Wenn ein: key Argument angegeben wird, ist dies ein Bezeichner für eine Funktion von ein Argument, das mit jedem Ei als Argument genannt wird, und ein Objekt Zi soll zum Vergleich verwendet werden. (Wenn es kein Schlüsselargument gibt, Zi ist Ei.)
Wenn Sie diese Art von Konvention übernehmen möchten, wäre Ihr Code etwas wie
%Vor%In Ihrem Fall ist das vielleicht kein großer Unterschied, aber Sie vermeiden einen zusätzlichen Funktionsaufruf. Im Allgemeinen kann dies hilfreich sein, da es einfacher ist, wichtige Argumente an Bibliotheksfunktionen zu übergeben, ohne sich darum kümmern zu müssen, ob sie nil sind oder nicht.
Um ein wenig in der Frage zu erweitern, würde #'identity
sein Argument zurückgeben, wenn Sie ein einzelnes Argument haben. #'list
würde mehrere Argumente als Liste zurückgeben, und #'values
würde sie als mehrere Werte zurückgeben, sie dienen dem gleichen Zweck, haben aber eine sehr unterschiedliche API.
Tags und Links common-lisp