2009-06-03 13 views
6

Estoy aprendiendo Scheme. ¿Qué hay de malo en el siguiente código? Quiero escribir un programa que toma la primera función de la lista y luego la aplica a un número?¿Cómo aplico una función anónima de una lista en el esquema?

(define num 3) 

    ;;I want to do something like this which returns 3 
    ((λ (x) x)num) 

    ;;but my functions are in a list so this should return3 
    ((first '((λ (x) x) (λ (x) (* x x)))) num) 

Im conseguir de este error para el código anterior:
aplicación de procedimiento: Procedimiento de esperar, dada: (λ (x) x); los argumentos fueron: 3

¿Qué significa cuando obtengo este tipo de resultados?

Cuando no aplico nada, obtengo un buen resultado.

(first '((λ(x) x)(λ(x) (*x x)))) 

retornos (λ (x) x)

Respuesta

11

Usted está citando, con 'la lambda, por lo que no se está evaluando.

Si solo introduce (λ (x) x) en el aviso, DrScheme muestra #<procedure>, lo que significa que realmente ha evaluado el lambda y le ha devuelto un cierre. Al citarlo, le está dando a Scheme solo una lista de símbolos.

Si usted quiere poner sus funciones en una lista, que puede hacer:

((first (list (lambda (x) x) (lambda (x) (* x x)))) num) 

La cita le permite producir una lista, sí, pero cuyo contenido no se evalúan. La función de lista produce una lista de todos sus argumentos, después de que hayan sido evaluados.

También podría quasiquote la lista, si quieres:

((first `(,(lambda (x) x) ,(lambda (x) (* x x)))) num) 
+0

Gracias. – unj2

2

¿Cuál es la diferencia entre estas expresiones?

> (procedure? (lambda (n) n)) 
#t 
> (procedure? (quote (lambda (n) n))) 
#f 
> (procedure? '(lambda (n) n)) 
#f 

Jay respondió por usted pero aún no lo puedo votar.

2

(lambda (x) x) no es un procedimiento. Es un formulario que evalúa a un procedimiento. La gente está un poco suelta con la terminología y a menudo llaman a la forma lambda un procedimiento como una especie de taquigrafía. "Ceci n'est pas une pipe."

+0

Es cierto, pero en última instancia, inútil como una explicación para los novatos que se confunden con tales problemas. Note por cierto que desde entonces Racket cambió la forma en que imprime los valores, lo que resulta en un error más claro: "...' procedimiento esperado, dado: '(λ (x) x) '..." - la cita es nueva. –

+1

Cuando era novato, esta era exactamente la oración que necesitaba para aclarar la confusión, así que la escribí para ayudar a los demás. Tal vez es simplemente "en última instancia, inútil" para todos menos para mí. – rptb1

+1

El problema es que Scheme tiene una confusión (¡muy intencional!) Entre el código y los datos, 'x' y''x', tu explicación es correcta (como dije) pero es un tipo similar de confusión en el nivel meta, donde 'x' es datos y" el valor vinculado a * x * "es el" código ". Para muchos estudiantes, este tipo de dualidad es muy confuso, y en su mayoría no se aclara completamente hasta que pasan por algo como el evaluador meta-circular. –

Cuestiones relacionadas