2010-05-31 18 views
6

En Scheme, ¿cómo puedo utilizar la abreviatura definir/lambda para expresiones lambda anidadas dentro de mi definición?Scheme define/lambda taquigrafía

Por ejemplo, dada la siguiente procedimiento ...

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

Uno puede acortarlo a esto:

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


Sin embargo, ¿cómo puedo acortar la siguiente función de manera similar?

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

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

Respuesta

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

El segundo lambda no se puede acortar.

Bueno, podría acortarlo a (define (makeOperator operator) operator), si no quiere hacer cumplir que la función devuelta tiene exactamente dos argumentos.

+0

Gracias - Voy a hacer +1 una vez que mi límite de votos se restablezca :). http://www.scheme.com/tspl2d/start.html#g1642 - si se desplaza un poco hacia abajo, el autor parece estar hablando de algún tipo de sintaxis de puntos para abreviar define. ¿Alguna idea de lo que está hablando? – Cam

+2

@incrediman: Sí, está hablando de '(define (f. Xs) ...)' que te permitirá llamar a f con un número arbitrario de argumentos (por ejemplo, '(f 1 2 3 4 5)') y ' xs' será una lista que contiene esos argumentos. – sepp2k

+0

Ahhh. Gotcha - gracias. Eso en realidad es bastante útil, así que me alegro de haberlo preguntado :) – Cam

4

Contrariamente a la respuesta anterior, la segunda lambdapuede utilizar la taquigrafía define notación:

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

No es realmente lo mismo. En mi taquigrafía más simple, no se declaran variables adicionales, pero aquí declaras foo. Entonces, si bien utiliza la sintaxis de definición, no es realmente una abreviatura. Además, es más larga que la versión lambda de sepp2k./fin opinión relativamente inculta – Cam

+2

(a) No dije que es más corta, solo que usa el formulario * taquigrafía * 'definir' que es lo que preguntaste; (b) su pregunta era si es posible usar esta notación para un 'lambda' interno; obviamente, esto incluiría un nombre adicional porque eso es exactamente lo que' define': no hay forma de usarlo sin un nombre. –

+0

Ah, y por cierto, si tu objetivo es hacerlo corto, entonces como sepp2k dijo que puedes usar el operador '(define (operador de operador))', y si realmente quieres llegar al final: '(define los valores de makeOperator) 'es más o menos lo mismo. –

6

Algunas implementaciones del Esquema - como Guile (probado con la versión 1.8) y MIT Esquema - proporcionar la siguiente notación abreviada:

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

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

creo que esta notación se utiliza mucho en Structure and Interpretation of Classical Mechanics.