¿Qué es un lenguaje lambda?

90

Estaba leyendo "JavaScript: The Good Parts" y el autor menciona que JavaScript es el primero de los lenguajes lambda que se lanzará.

Las funciones de JavaScript son objetos de primera clase con (en su mayoría) alcance léxico. JavaScript es el primer lenguaje lambda en generalizarse. En el fondo, JavaScript tiene más en común con Lisp y Scheme que con Java. Es Lisp con la ropa de C. Esto hace que JavaScript sea un lenguaje notablemente poderoso.

No entendí lo que es un lenguaje lambda. ¿Cuáles son las propiedades de dicho lenguaje y en qué se diferencia de lenguajes como Java, C, C ++ y Php?

sushil bharwani
fuente
6
Lambda significa expresión anónima. Lenguaje so lambda -> lenguaje con expresiones anónimas
bevacqua
Enlace de Google Books, FYI: books.google.co.uk/…
Lucas Jones
3
Consulte el cálculo lambda en wikipedia.
Oded el
muchas buenas respuestas. Lo que entendí de lejos es que si está utilizando una función anónima, entonces está trabajando en el lenguaje lambda. Es esa comprensión correcta de cuán diferentes son los lenguajes lamda de lenguajes como java.
sushil bharwani
4
"Estaba leyendo 'JavaScript: The Good Parts' y el autor menciona que JavaScript es el primero de los lenguajes lambda que se lanzará". Así que busqué en Google el lenguaje lambda y encontré esta pregunta en SO :)
Bugs Bunny

Respuestas:

38

Nunca escuché a nadie usar el término "lenguaje lambda", y las únicas definiciones plausibles que puedo pensar excluirían JavaScript como "la primera".

Dicho esto, sospecho que puede querer decir:

  • Lenguajes funcionales: una clase de lenguajes en los que la computación se modela (o puede) modelarse como una composición sin estado de funciones (posiblemente de orden superior). LISP, Scheme, ML, Haskell, etc. se atribuyen con frecuencia a esta clase, aunque varios de estos son lenguajes de paradigma mixto o "funcional opcional" más propiamente. Podría decirse que Javascript contiene las características necesarias para hacer posible un "estilo funcional" de programación.
  • Lenguajes que permiten la creación de funciones anónimas (usando la functionsintaxis en JavaScript; esto está escrito lambdaen muchos lenguajes, de ahí posiblemente "lenguajes lambda".

Ambos usos se derivan del uso de la letra griega lambda para denotar la abstracción de funciones en el cálculo lambda, el modelo de cálculo ideado por Alonzo Church y en el que se basa la programación funcional.

Editar: miró el resultado de Google Books --- "primero en generalizarse"; bueno, eso es discutible. Yo expuse que LISP fue en un momento al menos razonablemente convencional. Sin embargo, es un buen punto, la semántica de JavaScript está directamente inspirada en Scheme y ciertamente llegó a una audiencia más grande que cualquier otro lenguaje que pueda hacer afirmaciones similares.

Derrick Turk
fuente
por favor, vea el enlace publicado por Lucas Jones en el enlace del libro de Google donde lo lleva a la página exacta de la que estoy hablando. gracias por tu respuesta.
sushil bharwani
5
La razón por la que JavaScript se describe como "el primero" es porque la declaración está calificada con "para ir a la corriente principal". Creo que está bastante claro que JavaScript es de hecho el primer lenguaje de estilo funcional utilizado por los programadores cotidianos en los trabajos cotidianos.
rfunduk
1
¿A qué te refieres cuando dices "estilo funcional" del lenguaje de programación? Soy de experiencia en Java y trato de aprender JavaScript en qué se diferencia.
sushil bharwani
9
Es un gran tema para explorar. El año pasado estaba donde estás ahora: había encontrado los ensayos y conferencias de Crockford y quería entender los cierres. Te recomendaría que comiences con Wikipedia y luego sigas con algunos ensayos: John Hughes "Por qué importa la programación funcional" scribd.com/doc/26902/whyfp , Slava Akhmechet "Programación funcional para el resto de nosotros" defmacro.org/ramblings /fp.html Hay una gran cantidad de libros para expandir tu mente: echa un vistazo a Little Schemer para familiarizarte con Scheme y luego pasa a la Estructura e interpretación de los programas de computadora.
michiakig
5
@sushil: hay mucha literatura introductoria sobre el tema. Sin embargo, en términos generales, es un estilo de programación que enfatiza el tratamiento de los programas como objetos matemáticos en lugar de instrucciones secuenciales o interacciones entre objetos abstractos. Por ejemplo, los lenguajes funcionales preferirán la recursividad a la iteración, harán uso de estructuras de datos inmutables y usarán funciones de orden superior en lugar de "objetos de función" o "patrones de estrategia". Funciones de orden superior que significan funciones que pueden operar (como argumentos) o producir (como valores de retorno) otras funciones.
Derrick Turk
48

Un lenguaje lambda, en términos simples, es un lenguaje que permite pasar una función a otra función, donde la función se trata como cualquier otra variable. Además, debería poder definir esta función para que se pase de forma anónima (o en línea). PHP 5.3 agregó soporte para funciones lambda. ¿Fue JavaScript el primer lenguaje convencional? Lisp se ha utilizado ampliamente en entornos educativos antes de JavaScript y también en la personalización de nuestro querido Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/

Aquí hay un ejemplo

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

¿En qué se diferencia de C? En C, puede pasar puntero a funciones, pero no puede definirlo en línea de forma anónima.

En Java (antes de la versión 8), para lograr el mismo efecto, debe pasar un objeto que implemente una interfaz, que en realidad se puede definir de forma anónima en línea.

Juan Mendes
fuente
1
"Lisp ha sido ampliamente utilizado" por quién? Siempre lo supe, ya que los profesores siempre lo discutían, pero en la práctica, nunca he conocido a nadie que haya usado Lisp. Yo diría que cualquiera podría encontrar a alguien que conozca que haya usado Javascript, lo que hace que Javascript sea mucho más "convencional".
palswim
"PHP 5 agregó soporte para funciones lambda". En realidad, fue PHP 5.3 el que introdujo las funciones lambda.
Crozin
He conocido a pocas personas que lo usaban en un contexto empresarial, pero como lo fue alguna vez Pascal, se usa ampliamente en entornos educativos.
Juan Mendes
4

Se refiere al cálculo Lambda .

El cálculo lambda, también escrito como λ-cálculo, es un sistema formal para la definición de funciones, la aplicación de funciones y la recursividad. [...]

[...] con el cálculo lambda sin tipo como la inspiración original para la programación funcional, en particular Lisp, y los cálculos lambda con tipo que sirven como base para los sistemas de tipos modernos.

BenoitParís
fuente
4

He visto una lambda definida como una función anónima y como una referencia a una función. Javascript es compatible con ambos:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

Aquí es donde JS obtiene gran parte de su poder y flexibilidad. Java es compatible con la primera hasta cierto punto (implementaciones de interfaz anónimas), pero no con la última ; consulte a continuación la actualización para Java 8.

No me queda claro cuál (o ambos) de estos es la definición adecuada de una lambda.

Definitivamente JS no es el primer idioma que admite estas funciones. De memoria, creo que es una pequeña charla que los entusiastas del lenguaje siempre se entusiasman con el apoyo de lambdas.

Por cierto: en Java, una clase anónima se usa generalmente para pasar una definición de clase sobre la marcha para un argumento (se usa mucho en swing). Algo como esto (de memoria, no compilado):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

Actualizar

Java, a partir del 8, ahora es oficialmente un lenguaje Lambda.

Ahora puede utilizar la siguiente sintaxis:

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

Fuente de código

mtyson
fuente
1

En el material de curso abierto del MIT llamado estructura e interpretación de programas de computadora, un libro de Hal Abelson, Jerry Sussman y Julie Sussman. Hablan de Scheme, que es un dialecto de LISP y allí explican una explicación muy detallada y clara de qué es lambda y Scheme LISP y los lenguajes en general. Le recomiendo encarecidamente que lo consulte si desea tener una comprensión realmente clara y profunda de la programación de computadoras. Explicarte tomaría tres veces más tiempo que si fueras allí y solo leyeras el libro o vieras los tutoriales que lo explican perfectamente, es genial.

Javascript se basa principalmente en el lenguaje Scheme y su padre Lisp, y además tomó su estructura lamda y se generalizó con ella.

Max
fuente
0

De wikipedia: en lenguajes de programación como Lisp y Python, lambda es un operador que se usa para denotar funciones o cierres anónimos, siguiendo el uso del cálculo lambda. Un ejemplo de este uso de lambda en el lenguaje Python es esta sección de código de computadora que ordena una lista alfabéticamente por el último carácter de cada entrada:

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements
r3nrut
fuente
0
  • JavaScript permite definir una función anónima que es una función que no está vinculada a un identificador. Dicha función también se conoce como Lambda Abstraction y, dado que JS admite esto, se conoce como Lambda Language.

  • Propiedades: Esta función es necesaria en caso de ejecución inmediata de una función o para uso a corto plazo, donde no es significativo dar nombre a la función.

  • Es diferente de lenguajes como Java, C, C ++ y PHP, ya que en JS se utilizan funciones anónimas para Closure y Currying.

MERLIN THOMAS
fuente