tipo puede listas funciones expresiones expresion delegado convertir anonimas lambda scheme the-little-schemer

lambda - puede - listas en scheme



¿Cuál es el motivo para usar expresiones lambda para definir funciones en Scheme? (4)

Estoy leyendo el libro The Little Schemer de Daniel Friedman. No entiendo por qué cada función en el libro está escrita con una expresión lambda.

(define fun1 (lambda (x1 x2) (+ x1 x2))) (define (fun2 x1 x2) (+ x2 x2))

Las dos funciones hacen lo mismo, pero la segunda es más ordenada. Tengo curiosidad sobre las razones para usar lambda en todas partes.

Usé DrRacket en este caso.


Acabo de terminar The Little LISPer yo mismo. Inicialmente, estaba confundido sobre por qué habían empleado este idioma extraño. Como dices, este último es azúcar para el primero, y ciertamente se ve más ordenado, entonces, ¿de qué sirve usar funciones anónimas en todas partes?

Desde un punto de vista pedagógico, creo que prepara mejor al lector para los capítulos finales, que cubren currying, funciones de orden superior, el cálculo lambda, etc. En particular, la derivación del orden Y-combinator de orden aplicativa requiere el uso de lo que podría llamarse "envoltura de función innecesaria" en otros contextos. En el capítulo penúltimo, está tan familiarizado con este procedimiento que derivar el Y-combinator no es más difícil que servir un café o hacer un brindis. Está bien, en realidad no, pero creo que el estilo adoptado por los autores ciertamente te ayuda a acercarte más a la comprensión de esta difícil idea.


Es simplemente una cuestión de estilo. En The Little Schemer, los autores decidieron declarar explícitamente procedimientos usando lambdas, para dejar en claro que una definición de función asigna un nombre a un procedimiento (que es solo una expresión con un valor, como cualquier otro).

La otra forma de declarar funciones (sin lambdas explícitas) es completamente equivalente, y es solo azúcar sintáctico. Se podría argumentar que los autores eligieron la sintaxis más explícita por razones pedagógicas, no prácticas.


Una expresión lambda es una función literal, al igual que 3 (por ejemplo) es un literal entero. Podrías imaginar un lenguaje de programación donde no podrías usar 3 en una expresión más grande, pero tenías que definir una variable e inicializarla a 3. Todavía funcionaría, pero sería inconveniente y te pondría en el camino. La mayoría de los lenguajes son así con funciones (pueden definirse una sola vez y luego llamarse), pero los lenguajes funcionales le permiten tratar funciones como cualquier otra variable, incluida la posibilidad de referirse a ellas literalmente.

Al igual que cuando usa un entero literal cuando necesita un entero específico pero no necesita preocuparse por una variable, usa una expresión lambda cuando necesita una función, pero no necesita molestarse en nombrarla.

Un uso común es con funciones como mapcar que toma una función como argumento y aplica esa función a todos los elementos en el otro argumento. A veces solo quieres lanzar una función única sin necesidad de nombrarla.

Solo mirando ese ejemplo en particular, supongo que están señalando una diferencia entre el esquema y el ceceo (lisp lo hace de forma algo diferente).


(define (x . a) ...)

es solo una abreviatura para

(define x (lambda a ...))

En el primer informe de esquema de 1975 no tenía esta abreviatura. En el informe revisado de 1978 se introdujo.

El pequeño Schemer es solo una edición posterior de The little Lisper de 1974. Es anterior a Scheme y cuando se fija para seguir el Scheme que intentaron mantener es lo más parecido posible al original. Además de usar (define x (lambda (arg1) ...)) , es obvio que los enlaces de procedimientos no son diferentes de otros enlaces de variables que no sean el objeto al que apunta el código de cierre en lugar de los datos.

Si miras las videoconferencias del SICP , verás que Abelson y Sussman tienen estudiantes que están confundidos con esto, así que probablemente sea mejor usar solo uno de estos y dado que los procedimientos anónimos son algo que necesitas tocar, es obvio que quieres enseñar. la forma con una lambda explícita en lugar del azúcar sintáctico.