Pregunta

Después de aprender un poco del Esquema de SICP, empecé a leer El Pequeño Mediapunta (que me parece muy entretenido) y estoy cerca de una cuarta hecho.Me di cuenta de que puedo escribir muchas (la mayoría?todos?) soluciones sin necesidad de utilizar lambda mientras que El Pequeño Mediapunta siempre los usa.Por ejemplo, la primera definición es

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

que, si no me equivoco, se puede escribir simplemente como

(define (atom? x) 
   (and (not (pair? x)) (not (null? x))))

Me estoy perdiendo algo fundamental si escribo lambda-menos soluciones?

¿Fue útil?

Solución

Originalmente, define tenía una sola sintaxis para establecer una variable en un valor. Ese es el estilo utilizado en libros tan antiguos (y atemporales). Mas tarde, define Tengo una sintaxis diferente como atajo, que es el que estás usando.

Solo por diversión, busque en las bibliotecas de sus esquemas, puede encontrar una macro que expande la forma no lambda en la vieja lambda-pesa.

Otros consejos

Prefiero encarecidamente el lambda-La de estilo pesado para la enseñanza, ya que hace que la creación de funciones sea más explícita, como dice Jay.

Al aprender, las funciones simples con las que comienzas como atom? son defineD en el nivel superior. Esto significa que es posible, y aún más compacto, crear la función con el defun-estilo define mencionas.

Sin embargo, cuando comienza a usar funciones como valores de primera clase, por ejemplo, como argumento para map, verás lambda Por primera vez, y puede parecer más extraño y más mágico de lo que realmente es.

En cambio, si ha estado definiendo sus funciones con lambda Todo el tiempo, es menos un salto ver que las funciones son como cualquier otro valor. Resultan que están en el lado derecho de define Con bastante frecuencia, pero no son diferentes de un número o una constante citada:

(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))

Por supuesto, el lenguaje admite ambas formas, por lo que eventualmente se reduce al estilo. Para mí, hay una consistencia atractiva en el uso de define Cuando todas sus funciones se realizan con lambda: El primer argumento es siempre un símbolo, y el segundo argumento es cualquier expresión antigua. Y el hecho de que lambda es como cualquier expresión antigua es una de las cosas más importantes para que cualquier programador funcional aprenda.

Puede ver lo que su esquema expande estos atajos (macros) para usar expand (si es compatible):

MZSCHEME 4.2.4 (con drscheme):

> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
  (add1)
  (lambda (x) (apply + '1 x)))

Esquema Chez 8.0:

> (expand '(define (add1 x) (+ 1 x)))
(begin
  (set! add1
    (lambda (x)
      (+ 1 x)))
  (void))

los lambda parece simple como el día.

Recuerdo vagamente a un profesor discutiendo algo como esto.

Creo que la solución Lambda se usa por dos razones:

El primero es puramente algo histórico. En un momento en el tiempo, esa era la única forma en que era posible. Entonces, algunas personas todavía usan ese método.

El segundo es que a algunas personas les gusta ser más explícitas sobre el hecho de que se está creando una función, por lo que les gusta ver la palabra lambda.

Así que creo que la elección se reduce a lo que te guste personalmente.

Estoy leyendo un poco sobre el cálculo lambda (lectura de "La Implementación de Lenguajes de Programación Funcional" por Simon Peyton Jones;free pdf en línea), ya que el uso de TLS.Y así que esto es sólo una suposición, pero creo que los autores de TLS quiere realmente a ser lambda-pesado en su pensamiento.Ellos no vienen y dicen, pero hay indicios (ver p.107 de TLS) que todo esto es sólo un ejercicio aplicado lambda calc.Así que tal vez ellos están diciendo sin decir, "lo estás haciendo lambda abstracciones, mi amigo!"

El pequeño esquema utiliza un esquema de pseudo-código (para hacer simplificaciones con fines educativos y para ser independiente de la implementación). El esquema estándar de hoy tiene una definición de definición en la que está invocando implícitamente lambda (ver http://www.cs.cmu.edu/groups/ai/html/r4rs/r4rs_7.html). El pequeño esquema de esquema es muy simple y no incluye esta forma alternativa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top