2010-05-31 1 views
6

Wie kann ich in Scheme die Define/Lambda-Kurzschrift für verschachtelte Lambda-Ausdrücke innerhalb meiner Definition verwenden?Schema definieren/Lambda-Kurzschreibweise

Zum Beispiel mit dem folgenden Verfahren ...

(define add 
    (lambda (num1 num2) 
    (+ num1 num2))) 

Man kann es so weit verkürzen:

(define (add num1 num2) 
    (+ num1 num2)) 


Doch wie kann ich die folgende Funktion in ähnlicher Weise zu verkürzen?

(define makeOperator 
    (lambda (operator) 
    (lambda (num1 num2) 
     (operator num1 num2)))) 

;example useage - equivalent to (* 3 4): 
((makeOperator *) 3 4) 

Antwort

13
(define (makeOperator operator) 
    (lambda (num1 num2) 
    (operator num1 num2))) 

Der zweite Lambda verkürzt werden kann.

Nun können Sie es auf (define (makeOperator operator) operator) verkürzen, wenn Sie nicht erzwingen möchten, dass die zurückgegebene Funktion genau zwei Argumente dauert.

+0

Danke - Ich werde Ihnen +1 geben, sobald mein Stimmlimit zurückgesetzt wird :). http://www.scheme.com/tspl2d/start.html#g1642 - Wenn Sie ein wenig nach unten scrollen, scheint der Autor über eine Art Punktsyntax zum Verkürzen von Defines zu sprechen. Irgendeine Idee worüber er spricht? – Cam

+2

@incrediman: Ja, er redet über '(define (f. Xs) ...)', was es erlaubt, f mit einer beliebigen Anzahl von Argumenten aufzurufen (zB '(f 1 2 3 4 5)') und ' xs' wird eine Liste mit diesen Argumenten sein. – sepp2k

+0

Ahhh. Gotcha - danke. Das ist eigentlich sehr nützlich, also bin ich froh, dass ich gefragt habe :) – Cam

4

Im Gegensatz zu der oben Antwort, die zweite lambdakann verwenden die Kurz define Notation:

(define (makeOperator operator) 
    (define (foo num1 num2) 
    (operator num1 num2)) 
    foo) 
+1

Es ist nicht wirklich das Gleiche. In meiner einfacheren Kurzschrift werden keine zusätzlichen Variablen deklariert, aber hier deklarieren Sie foo. Obwohl es die Definitionssyntax verwendet, ist es nicht wirklich eine Abkürzung. Plus es ist länger als die Lambda-Version von Sepp2k./end relativ ungebildete Meinung – Cam

+2

(a) Ich habe nicht gesagt, dass es kürzer ist - nur dass es die * shorthand * 'define' Form verwendet, nach der Sie gefragt haben; (b) Ihre Frage war, ob es möglich ist, diese Notation für ein internes 'Lambda' zu verwenden - offensichtlich würde dies mit einem zusätzlichen Namen kommen, weil genau das' define' tut: Es gibt keine Möglichkeit, es ohne einen Namen zu verwenden. –

+0

Oh, und BTW, wenn Ihr Ziel ist es nur kurz zu machen, dann wie Sepp2k sagte Sie können '(definieren (makeOperator operator) -Operator)', und wenn Sie wirklich den ganzen Weg gehen wollen: '(Definieren Sie makeOperator Werte) ist ungefähr dasselbe. –

6

Einige Implementierungen von Scheme - wie Guile (mit Version getestet 1.8) und MIT Scheme - bieten die Kurzschreibweise folgende:

(define ((foo x) y) (+ x y)) 

(foo 5) 
; => procedure 
((foo 5) 3) 
; => 8 

ich glaube, diese Schreibweise ziemlich viel in Structure and Interpretation of Classical Mechanics verwendet wird.