Funktion, die nur ihr Argument zurückgibt?

7

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:

ersetzen %Vor%     
ElliotPenson 08.07.2014, 21:49
quelle

3 Antworten

10

Schauen Sie sich identity :

an
  

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.

    
sds 08.07.2014, 21:59
quelle
10

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

%Vor%

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.

    
Joshua Taylor 08.07.2014 22:11
quelle
1

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.

    
thodg 12.07.2014 15:43
quelle

Tags und Links