2016-04-23 20 views
4

Ich habe einige Schwierigkeiten herauszufinden, wie man Lambda verwendet, die in Listen in Scheme enthalten sind. Zum Beispiel habe ich den folgenden Code:Wie verwendet man Lambdas aus einer Liste in Schema

(define abc '((lambda (x) (* x x)))) 

Ich mag würde das erste Lambda aus der Liste nehmen und es auf einige Zahlen gelten. Hier ist, was ich bisher:

(map (car abc) '(1 2 3)) 

Allerdings bekomme ich folgende Fehlermeldung:

;The object (lambda (x) (* x x)) is not applicable. 

Aber wenn ich versuche, die gleiche Sache direkt nur das Lambda verwenden, funktioniert es:

(map (lambda (x) (* x x)) '(1 2 3)) 
;Value 15: (1 4 9) 

Kann mir jemand helfen zu verstehen, was ich falsch mache?

+0

Das Problem, dass Sie behandeln '' ((Lambda ...)) ', als ob es das gleiche wäre wie' (Liste (Lambda ...)) ', aber sie sind radikal anders. [Diese Frage] (https://stackoverflow.com/questions/34984552/what-ist-the-difference-between-quote-and-list) und ihre Antwort machen einen guten Job bei der Erklärung warum. –

+0

Wenn Sie nicht wissen, wie 'quote' funktioniert, werden Sie viel weniger Fehler machen, wenn Sie nur' list' überall verwenden und nie 'quote' für Listen verwenden, nur für Symbole. –

Antwort

6

sollten Sie verstehen, dass

(lambda() 42) 

und

'(lambda() 42) 

sind nicht dasselbe. Der erste gibt Ihnen bei der Auswertung ein Callable Object zurück, das beim Aufruf 42 zurückgibt, der zweite gibt bei der Auswertung eine Liste zurück, in der das erste Element das Symbol lambda ist, das zweite Element ist eine leere Liste und das dritte Element ist die Nummer 42.

Ihr Code definiert abc als Liste mit einer Liste, in der das erste Element das Symbol lambda ist, keine Liste mit einer aufrufbaren Funktion. Dafür benötigen Sie

(define abc (list (lambda (x) (* x x)))) 

mit anderen Worten schreiben eine lambda Form Sie eine aufrufbare Funktion geben ausgewertet werden muss.

+1

Eine andere Notation, obwohl in diesem Zusammenhang weniger klar, manchmal klarer, wenn sie richtig verwendet wird, ist die Verwendung eines Quasi-Zitats (back-tic '), mit dem Sie eine große Datenstruktur zitieren können, aber Teile davon mit (unquote,) – Anandamide

+1

'(, (Lambda (x) (* xx)), (Lambda (x) x), (Lambda (x) 5)) – Anandamide