2010-05-31 10 views
6

In Scheme, come posso utilizzare la stenografia define/lambda per espressioni lambda annidate all'interno della mia definizione?Schema define/lambda stenografia

Ad esempio dato la seguente procedura ...

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

si può ridurre a questo:

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


Tuttavia, come posso accorciare la seguente funzione simile?

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

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

risposta

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

La seconda lambda non può essere abbreviato.

Bene si potrebbe abbreviare a (define (makeOperator operator) operator), se non si vuole far rispettare che la funzione restituita richiede esattamente due argomenti.

+0

Grazie - Aggiungerò +1 al mio reset del limite di voto :). http://www.scheme.com/tspl2d/start.html#g1642 - se si scorre verso il basso un po ', l'autore sembra parlare di una sorta di sintassi del punto per definire i criteri di accorciamento. Qualche idea di cosa sta parlando? – Cam

+2

@incrediman: Sì, sta parlando di '(define (f. Xs) ...)' che ti permetterà di chiamare f con un numero arbitrario di argomenti (es. '(F 1 2 3 4 5)') e ' xs' sarà una lista contenente quegli argomenti. – sepp2k

+0

Ahhh. Gotcha - grazie. In realtà è abbastanza utile, quindi sono contento di averlo chiesto :) – Cam

4

Contrariamente alla risposta di cui sopra, la seconda lambdapuò utilizzare la scorciatoia define notazione:

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

Non è proprio la stessa cosa. Nella mia più semplice stenografia, non vengono dichiarate variabili extra, ma qui stai dichiarando foo. Quindi mentre usa la sintassi define, non è una scorciatoia. Inoltre è più lungo della versione lambda di sepp2k./fine opinione relativamente non istruita – Cam

+2

(a) Non ho detto che è più breve - solo che utilizza il * shorthand * 'define' form che è quello che hai chiesto; (b) la tua domanda era se fosse possibile usare questa notazione per un 'lambda' interno - ovviamente, questo avrebbe un nome extra perché questo è esattamente ciò che fa 'define': non c'è modo di usarlo senza un nome. –

+0

Oh, e BTW, se il tuo obiettivo è quello di renderlo breve, allora sepp2k ha detto che puoi usare '(define (operatore makeOperator))', e se vuoi davvero andare fino in fondo: '(definisci i valori di makeOperator) 'è più o meno lo stesso. –

6

Alcune implementazioni di Scheme - come Guile (testato con la versione 1.8) e MIT Scheme - fornire al seguente notazione abbreviata:

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

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

credo che questa notazione è usato un bel po 'in Structure and Interpretation of Classical Mechanics.