2010-05-31 6 views
6

Dans Scheme, comment puis-je utiliser le raccourci define/lambda pour les expressions lambda imbriquées dans ma définition?Schéma define/lambda shorthand

Par exemple donné la procédure suivante ...

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

On peut le raccourcir à ceci:

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


Cependant, comment puis-je réduire la fonction suivante de la même?

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

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

Répondre

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

Le deuxième lambda ne peut être raccourci.

Eh bien, vous pouvez le raccourcir à (define (makeOperator operator) operator), si vous ne voulez pas que la fonction retournée prenne exactement deux arguments.

+0

Merci - Je vous donnerai +1 lorsque ma limite de votes sera rétablie :). http://www.scheme.com/tspl2d/start.html#g1642 - si vous faites défiler un peu, l'auteur semble parler d'une sorte de syntaxe à points pour raccourcir les définitions. Une idée de quoi il parle? – Cam

+2

@incrediman: Oui, il parle de '(define (f.xs) ...)' qui vous permettra d'appeler f avec un nombre arbitraire d'arguments (par exemple '(f 1 2 3 4 5)') et ' xs' sera une liste contenant ces arguments. – sepp2k

+0

Ahhh. Gotcha - merci. C'est en fait assez utile lui-même, donc je suis content d'avoir demandé :) – Cam

4

Contrairement à la réponse ci-dessus, la deuxième lambdapeut utiliser la notation define abrégée:

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

Ce n'est pas vraiment la même chose. Dans mon raccourci plus simple, aucune variable supplémentaire n'est déclarée, mais ici vous déclarez foo. Donc, bien qu'il utilise la syntaxe définie, ce n'est pas vraiment un raccourci. De plus, c'est plus long que la version lambda de sepp2k./fin opinion relativement non éduquée – Cam

+2

(a) Je n'ai pas dit que c'est plus court - seulement qu'il utilise la forme * shorthand * 'define' qui est ce que vous avez demandé à propos de; (b) votre question était de savoir s'il est possible d'utiliser cette notation pour un 'lambda' interne - évidemment, cela vient avec un nom supplémentaire parce que c'est exactement ce que' define' fait: il n'y a pas moyen de l'utiliser sans nom. –

+0

Oh, et BTW, si votre objectif est de le rendre court, alors comme sepp2k a dit que vous pouvez utiliser '(opérateur (define (makeOperator operator)), et si vous voulez vraiment aller jusqu'au bout:' (define makeOperator values) 'est à peu près la même chose. –

6

Certaines implémentations du schéma - comme Guile (testé avec la version 1.8) et le MIT Scheme - fournir suivant la notation abrégée:

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

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

Je crois que cette notation est utilisée beaucoup dans Structure and Interpretation of Classical Mechanics.