Programmierung höherer Ordnung mit Lisp: Eine Funktion an mapcar übergeben?

8

Ich lerne gerade ANSI Common Lisp (mit clisp auf einem Win32-Rechner) und ich frage mich, ob Mapcar eine Funktion als formales Argument verwenden könnte? Bitte beachten Sie Folgendes:

%Vor%

Dies würde meiner Meinung nach ein höheres Maß an Flexibilität bieten als:

%Vor%     
CaitlinG 08.01.2012, 03:39
quelle

2 Antworten

29

Das ist absolut möglich! Du bist fast da. Sie sind einfach in die doppelten Namespaces von Common Lisp gerutscht, an die Sie sich lange gewöhnen müssen. Ich hoffe, ich kann ein oder zwei Dinge sagen, um die beiden Namensräume von Common Lisp etwas weniger verwirrend zu machen.

Ihr Code ist fast korrekt. Du hast geschrieben:

%Vor%

Aber was versucht das zu tun? Nun, # ' ist eine Kurzschrift. Ich werde es für Sie erweitern.

%Vor%

Also, # 'symbol ist eine Abkürzung für (Funktionssymbol) . In Common Lisp - wie Sie zu wissen scheinen - können Symbole an eine Funktion und an eine Variable gebunden sein; Das sind die beiden Namespaces, über die Lispers so viel spricht: den Funktionsnamensraum und den Variablennamespace.

Nun, was die Funktion spezielle Form tut, wird die Funktion an ein Symbol gebunden, oder, wenn Sie möchten, den Wert, den das Symbol im Funktionsnamensraum hat.

Nun, auf der REPL, was Sie geschrieben haben, wäre offensichtlich, was Sie wollen.

%Vor%

Würde die car -Funktion einer Reihe von Listen zuordnen. Und das Auto Symbol hat keine variable Bindung, nur eine Funktionsbindung, weshalb Sie (function ...) (oder seine Kurzschrift, #) verwenden müssen. ') um an die eigentliche Funktion zu kommen.

Ihre foo -Funktion funktioniert nicht, weil die Funktion, die Sie als Argument übergeben, an ein Symbol als Variable gebunden ist . Versuchen Sie Folgendes:

%Vor%

Sie haben vielleicht eine Liste der Quadratwurzeln dieser Zahlen erwartet, aber es hat nicht funktioniert. Das liegt daran, dass Sie let verwendet haben, um die Quadratwurzelfunktion an fn als Variable zu binden. Versuchen Sie nun diesen Code:

%Vor%

Herrlich! Dies bindet die Quadratwurzelfunktion an das Symbol fn als Variable.

Also, lassen Sie uns Ihre foo Funktion überarbeiten:

%Vor%

Das wird funktionieren, weil fn eine Variable ist. Lass es uns testen, nur um sicher zu gehen:

%Vor%

Der erste funktionierte nicht, weil die Quadratwurzelfunktion im Funktionsnamensraum an sqrt gebunden ist. Im zweiten Fall haben wir die Funktion aus dem Symbol genommen und an foo übergeben, was sie als Variable an das Symbol fn gebunden hat.

Okay, was ist, wenn Sie eine Funktion an ein Symbol im Funktionsnamensraum binden wollen? Nun, für den Anfang macht defun das dauerhaft. Wenn Sie möchten, dass es temporär ist, wie eine Bindung , verwenden Sie flet . Flet ist meiner Meinung nach dumm, weil es nicht genau so funktioniert wie Let. Aber, ich werde ein Beispiel geben, nur damit Sie sehen können.

%Vor%

funktioniert nicht, weil flet die Funktion nicht an das Symbol im Variablennamespace gebunden hat, sondern an den Funktionsnamensraum.

%Vor%

Dies wird tun, was Sie erwarten, weil flet diese Funktion an das Symbol fn im Funktionsnamensraum gebunden hat. Und, nur um die Idee des Funktionsnamensraums nach Hause zu bringen:

%Vor%

Gibt 4 zurück.

    
Daniel Ralston 08.01.2012 04:22
quelle
3

Sicher, du kannst das tun:

%Vor%

Beispiele:

%Vor%     
Chris Jester-Young 08.01.2012 04:03
quelle

Tags und Links