Cos'è una lingua lambda?


90

Stavo leggendo "JavaScript: The Good Parts" e l'autore afferma che JavaScript è il primo dei linguaggi lambda ad essere lanciato.

Le funzioni di JavaScript sono oggetti di prima classe con (principalmente) ambito lessicale. JavaScript è il primo linguaggio lambda a diventare mainstream. In fondo, JavaScript ha più in comune con Lisp e Scheme che con Java. È Lisp nei vestiti di C. Ciò rende JavaScript un linguaggio straordinariamente potente.

Non ho capito cos'è una lingua lambda. Quali sono le proprietà di un tale linguaggio e in che modo è diverso da linguaggi come Java, C, C ++ e Php?


6
Lambda significa espressione anonima. Quindi lingua lambda -> linguaggio con espressioni anonime
bevacqua

Link a Google Libri, FYI: books.google.co.uk/…
Lucas Jones,

3
Vedi lambda calcolo su wikipedia.
Oded

molte buone risposte. Quello che ho capito di gran lunga è che se stai usando la funzione anonima, allora stai lavorando sul linguaggio lambda. è quella corretta comprensione di quanto siano diversi i linguaggi lamda da linguaggi come Java.
sushil bharwani

4
"Stavo leggendo 'JavaScript: The Good Parts' e l'autore afferma che JavaScript è il primo dei linguaggi lambda ad essere lanciato." Quindi ho cercato su Google la lingua lambda e ho trovato questa domanda su SO :)
Bugs Bunny

Risposte:


38

Non ho mai sentito nessuno usare il termine "linguaggio lambda" e le uniche definizioni plausibili a cui riesco a pensare escluderebbero JavaScript come "il primo".

Detto questo, sospetto che possa voler dire:

  • Linguaggi funzionali: una classe di linguaggi in cui il calcolo è (o può essere) modellato come una composizione senza stato di funzioni (possibilmente di ordine superiore). LISP, Scheme, ML, Haskell, ecc. Sono spesso attribuiti a questa classe, sebbene molti di questi siano paradigmi più propriamente misti o linguaggi "funzionali opzionali". Javascript contiene probabilmente le caratteristiche necessarie per rendere possibile uno "stile funzionale" di programmazione.
  • Linguaggi che consentono la creazione di funzioni anonime (usando la functionsintassi in JavaScript; questo è scrittolambda in molti linguaggi, quindi forse "linguaggi lambda".

Entrambi gli usi derivano dall'uso della lettera greca lambda per denotare l'astrazione della funzione nel lambda calcolo, il modello di calcolo ideato da Alonzo Church e su cui si basa la programmazione funzionale.

Modifica: ha esaminato il risultato di Google Libri --- "il primo a diventare mainstream"; beh, è ​​discutibile. Ho affermato che LISP è stato almeno ragionevolmente mainstream. È un punto giusto, tuttavia, la semantica di JavaScript è direttamente ispirata da Scheme e ha sicuramente raggiunto un pubblico più ampio rispetto a qualsiasi altro linguaggio che può fare affermazioni simili.


si prega di consultare il collegamento pubblicato da Lucas Jones collegamento al libro di Google dove si porta alla pagina esatta di cui sto parlando. grazie per la tua risposta.
sushil bharwani

5
Il motivo per cui JavaScript è descritto come "il primo" è perché l'affermazione è qualificata con "to go mainstream". Penso che sia abbastanza chiaro che JavaScript è davvero il primo linguaggio in stile funzionale ad essere utilizzato dai programmatori di tutti i giorni nei lavori di tutti i giorni.
rfunduk

1
cosa intendi quando dici "stile funzionale" del linguaggio di programmazione. Vengo da un background Java e sto cercando di imparare JavaScript in che modo è diverso.
sushil bharwani

9
È un argomento enorme da esplorare. L'anno scorso ero dove sei ora: avevo trovato i saggi e le conferenze di Crockford e volevo capire le chiusure. Ti consiglierei di iniziare con Wikipedia, quindi passare ad alcuni saggi: John Hughes "Why Functional Programming Matters" scribd.com/doc/26902/whyfp , Slava Akhmechet "Functional Programming for the rest of us" defmacro.org/ramblings /fp.html Ci sono moltissimi libri per espandere la tua mente: dai un'occhiata a Little Schemer per avere un'idea di Scheme, e poi passa alla Struttura e interpretazione dei programmi per computer.
michiakig

5
@sushil: c'è molta letteratura introduttiva sull'argomento. In termini generali, tuttavia, è uno stile di programmazione che enfatizza il trattamento dei programmi come oggetti matematici piuttosto che come istruzioni sequenziali o interazioni tra oggetti astratti. Ad esempio, i linguaggi funzionali preferiranno la ricorsione all'iterazione, faranno uso di strutture di dati immutabili e useranno funzioni di ordine superiore rispetto a "oggetti funzione" o "modelli di strategia". Funzioni di ordine superiore che significano funzioni che possono operare su (come argomenti) o produrre (come valori di ritorno) altre funzioni.
Derrick Turk

48

Un linguaggio lambda, in termini semplici, è un linguaggio che consente di passare una funzione a un'altra funzione, dove la funzione viene trattata come qualsiasi altra variabile. Inoltre, dovresti essere in grado di definire questa funzione in modo che venga passata in modo anonimo (o inline). PHP 5.3 ha aggiunto il supporto per le funzioni lambda. JavaScript è stato il primo linguaggio mainstream? Lisp è stato ampiamente utilizzato nelle impostazioni educative prima di JavaScript e anche nella personalizzazione del nostro amato Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/

Ecco un esempio

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})

In cosa differisce dal C? In C, puoi passare il puntatore alle funzioni, ma non puoi definirlo in linea in modo anonimo.

In Java (prima della versione 8), per ottenere lo stesso effetto, è necessario passare un oggetto che implementa un'interfaccia, che in realtà può essere definita in linea anonima.


1
"Lisp è stato ampiamente utilizzato" da chi? L'ho sempre saputo, dato che i professori ne discutevano sempre, ma in pratica non ho mai incontrato nessuno che abbia usato Lisp. Direi che chiunque potrebbe trovare qualcuno che conosce che ha utilizzato Javascript, il che rende Javascript molto più "mainstream".
palswim

"PHP 5 ha aggiunto il supporto per le funzioni lambda". In realtà era PHP 5.3 che ha introdotto le funzioni lambda.
Crozin

Ho incontrato poche persone che lo hanno utilizzato in un contesto lavorativo, ma come una volta Pascal, è ampiamente utilizzato in contesti educativi.
Juan Mendes

4

Si riferisce al Lambda calcolo .

Lambda calcolo, scritto anche come λ-calcolo, è un sistema formale per la definizione di funzioni, l'applicazione di funzioni e la ricorsione. [...]

[...] con lambda calcolo non tipizzato che è l'ispirazione originale per la programmazione funzionale, in particolare Lisp, e lambda calculi tipizzati che servono come base per i sistemi di tipi moderni.


4

Ho visto un lambda definito come una funzione anonima e come riferimento a una funzione. Javascript supporta entrambi:

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

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

È qui che JS ottiene molta della sua potenza e flessibilità. Java supporta il primo in una certa misura (implementazioni dell'interfaccia anonima), ma non il secondo - vedi sotto per l'aggiornamento per Java 8.

Non mi è chiaro quale (o entrambi) di questi sia la definizione corretta di lambda.

JS non è sicuramente la prima lingua a supportare queste funzionalità. A partire dalla memoria, penso che sia una parola piccola che gli appassionati di lingue siano sempre entusiasti di supportare i lambda.

BTW: In Java, una classe anonima viene solitamente utilizzata per passare una definizione di classe al volo per un argomento (molto usata in swing). Qualcosa di simile (dalla memoria, non compilato):

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

Aggiornare

Java, a partire da 8, è ora ufficialmente un linguaggio Lambda.

È ora possibile utilizzare la seguente sintassi:

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

Codice sorgente


1

Nel corso aperto del MIT, chiamato struttura e interpretazione dei programmi per computer, un libro di Hal Abelson, Jerry Sussman e Julie Sussman. Discutono di Scheme, che è un dialetto di LISP e lì spiegano una spiegazione molto dettagliata e chiara di cosa sia lambda, Scheme LISP e lingue in generale. Consiglio vivamente di guardarlo se desideri avere una comprensione davvero chiara e profonda della programmazione per computer. Per spiegarti ci vorrebbe il triplo del tempo che se andassi lì e leggessi il libro o guardassi i tutorial che lo spiegano perfettamente, è geniale.

Javascript si basa principalmente sul linguaggio Scheme ed è il padre Lisp, e inoltre ha preso la sua struttura lamda ed è diventato mainstream con esso.


0

Da wikipedia: nei linguaggi di programmazione come Lisp e Python, lambda è un operatore utilizzato per denotare funzioni o chiusure anonime, seguendo l'uso del lambda calcolo. Un esempio di questo utilizzo di lambda nel linguaggio Python è questa sezione del codice del computer che ordina alfabeticamente un elenco in base all'ultimo carattere di ogni voce:

>>> 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

0
  • JavaScript consente di definire una funzione anonima che è una funzione che non è vincolata a un identificatore. Tale funzione è anche nota come Lambda Abstraction e poiché JS la supporta, è nota come Lambda Language.

  • Proprietà: questa funzione è necessaria in caso di esecuzione immediata di una funzione o per un utilizzo a breve termine, dove non è importante dare un nome alla funzione.

  • È diverso da linguaggi come Java, C, C ++ e PHP poiché in JS le funzioni anonime sono utilizzate per la chiusura e il currying.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.