Apa itu bahasa lambda?

90

Saya membaca "JavaScript: Bagian yang Baik" dan penulis menyebutkan bahwa JavaScript adalah bahasa lambda pertama yang diluncurkan.

Fungsi JavaScript adalah objek kelas satu dengan (kebanyakan) cakupan leksikal. JavaScript adalah bahasa lambda pertama yang menjadi mainstream. Jauh di lubuk hati, JavaScript memiliki lebih banyak kesamaan dengan Lisp dan Skema daripada dengan Java. Ini adalah pakaian Lisp in C. Ini membuat JavaScript menjadi bahasa yang sangat kuat.

Saya tidak mengerti apa itu bahasa lambda. Apa sajakah properti bahasa tersebut dan apa bedanya dengan bahasa seperti Java, C, C ++ dan Php?

sushil bharwani
sumber
6
Lambda berarti ekspresi anonim. Jadi bahasa lambda -> bahasa dengan ekspresi anonim
bevacqua
Tautan Google Buku, FYI: books.google.co.uk/…
Lucas Jones
3
Lihat kalkulus lambda di wikipedia.
Oded
banyak balasan bagus. Apa yang saya pahami sejauh ini adalah jika Anda menggunakan fungsi anonim maka Anda sedang mengerjakan bahasa lambda. Apakah itu pemahaman yang benar betapa berbedanya bahasa lamda dari bahasa seperti java.
sushil bharwani
4
"Saya membaca 'JavaScript: The Good Parts' dan penulis menyebutkan bahwa JavaScript adalah bahasa lambda pertama yang diluncurkan." Jadi saya mencari di Google bahasa lambda dan menemukan pertanyaan ini di SO :)
Bugs Bunny

Jawaban:

38

Saya belum pernah mendengar ada orang yang menggunakan istilah "bahasa lambda", dan satu-satunya definisi yang masuk akal yang dapat saya pikirkan akan mengecualikan JavaScript sebagai "yang pertama".

Karena itu, saya kira dia mungkin bermaksud:

  • Bahasa fungsional: kelas bahasa di mana komputasi (atau dapat) dimodelkan sebagai komposisi stateless dari fungsi (mungkin tingkat tinggi). LISP, Scheme, ML, Haskell, dll. Sering dianggap berasal dari kelas ini, meskipun beberapa di antaranya lebih cocok untuk paradigma campuran atau bahasa "opsional fungsional". Javascript bisa dibilang berisi fitur yang diperlukan untuk membuat "gaya fungsional" pemrograman menjadi mungkin.
  • Bahasa yang memungkinkan pembuatan fungsi anonim (menggunakan functionsintaks di JavaScript; ini ditulis lambdadalam banyak bahasa, karenanya mungkin "bahasa lambda".

Kedua penggunaan tersebut berasal dari penggunaan huruf yunani lambda untuk menunjukkan abstraksi fungsi dalam kalkulus lambda, model komputasi yang dirancang oleh Gereja Alonzo dan yang menjadi dasar pemrograman fungsional.

Sunting: melihat hasil Google Buku --- "pertama menjadi arus utama"; baik, itu bisa diperdebatkan. Saya akan mengemukakan bahwa LISP pada satu hal setidaknya cukup umum. Ini adalah poin yang adil, semantik JavaScript secara langsung terinspirasi oleh Skema dan tentu saja menjangkau audiens yang lebih besar daripada bahasa lain yang dapat membuat klaim serupa.

Derrick Turk
sumber
silakan lihat link yang diposting oleh Lucas Jones link buku Google di mana dia membawa ke halaman yang tepat yang saya bicarakan. terima kasih atas jawaban Anda.
sushil bharwani
5
Alasan JavaScript digambarkan sebagai 'yang pertama' adalah karena pernyataan tersebut memenuhi syarat dengan 'menjadi arus utama'. Saya pikir cukup jelas bahwa JavaScript memang bahasa gaya-fungsional pertama yang digunakan oleh programmer harian pada pekerjaan sehari-hari.
rfunduk
1
apa yang Anda maksud ketika Anda mengatakan "gaya-fungsional" dari bahasa pemrograman. Saya dari latar belakang java dan mencoba belajar javascript apa bedanya.
sushil bharwani
9
Ini topik yang sangat besar untuk dijelajahi. Tahun lalu saya berada di tempat Anda sekarang: Saya telah menemukan esai dan ceramah Crockford dan ingin memahami penutup. Saya akan merekomendasikan Anda memulai dengan Wikipedia, kemudian beralih ke beberapa esai: John Hughes "Why Functional Programming Matters" scribd.com/doc/26902/whyfp , Slava Akhmechet "Pemrograman Fungsional untuk kita semua" defmacro.org/ramblings /fp.html Ada banyak sekali buku untuk memperluas pikiran Anda: lihat Little Schemer untuk mengetahui Skema, lalu lanjutkan ke Struktur dan Interpretasi Program Komputer.
michiakig
5
@sushil: ada banyak literatur pengantar tentang topik tersebut. Namun secara umum, ini adalah gaya pemrograman yang menekankan perlakukan program sebagai objek matematika daripada instruksi atau interaksi berurutan antara objek abstrak. Misalnya, bahasa fungsional akan lebih memilih rekursi daripada iterasi, menggunakan struktur data yang tidak dapat diubah, dan menggunakan fungsi tingkat tinggi dalam preferensi untuk "objek fungsi" atau "pola strategi". Fungsi tingkat tinggi berarti fungsi yang dapat beroperasi pada (sebagai argumen) atau menghasilkan (sebagai nilai yang dikembalikan) fungsi lain.
Derrick Turk
48

Bahasa lambda, dalam istilah sederhana, adalah bahasa yang memungkinkan penerusan fungsi ke fungsi lain, di mana fungsi tersebut diperlakukan sebagai variabel lain. Selain itu, Anda harus dapat menentukan fungsi ini untuk diteruskan secara anonim (atau sebaris). PHP 5.3 menambahkan dukungan untuk fungsi lambda. Apakah JavaScript adalah bahasa utama pertama? Lisp telah banyak digunakan dalam pengaturan pendidikan sebelum JavaScript dan juga dalam menyesuaikan Emacs tercinta kami http://www.gnu.org/software/emacs/manual/html_node/eintr/

Berikut contohnya

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

Apa bedanya dengan C? Di C, Anda bisa meneruskan pointer ke fungsi, tapi Anda tidak bisa mendefinisikannya sebaris secara anonim.

Di Java (sebelum versi 8), untuk mencapai efek yang sama, Anda harus meneruskan objek yang mengimplementasikan antarmuka, yang sebenarnya dapat didefinisikan sebaris secara anonim.

Juan Mendes
sumber
1
"Lisp sudah banyak digunakan" oleh siapa? Saya selalu tahu tentang itu, karena profesor selalu membahasnya, tetapi dalam praktiknya, saya belum pernah bertemu orang yang pernah menggunakan Lisp. Saya akan mengatakan bahwa siapa pun dapat menemukan seseorang yang mereka kenal yang telah menggunakan Javascript, yang membuat Javascript jauh lebih "mainstream".
palswim
"PHP 5 menambahkan dukungan untuk fungsi lambda". Sebenarnya saya adalah PHP 5.3 yang memperkenalkan fungsi lambda.
Crozin
Saya telah bertemu beberapa orang yang menggunakannya dalam konteks bisnis, tetapi seperti Pascal dulu, ini banyak digunakan dalam pengaturan pendidikan.
Juan Mendes
4

Dia mengacu pada kalkulus Lambda .

Kalkulus Lambda, juga ditulis sebagai λ-kalkulus, adalah sistem formal untuk definisi fungsi, aplikasi fungsi, dan rekursi. [...]

[...] dengan kalkulus lambda tanpa tipe menjadi inspirasi asli untuk pemrograman fungsional, khususnya Lisp, dan kalkulus lambda yang diketik berfungsi sebagai dasar untuk sistem tipe modern.

BenoitParis
sumber
4

Saya telah melihat lambda didefinisikan sebagai fungsi anonim dan sebagai referensi ke suatu fungsi. Javascript mendukung keduanya:

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

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

Di sinilah JS mendapatkan banyak kekuatan dan fleksibilitasnya. Java mendukung yang pertama sampai batas tertentu (implementasi antarmuka anonim), tetapi tidak mendukung yang terakhir - lihat di bawah untuk pembaruan untuk Java 8.

Tidak jelas bagi saya yang mana (atau keduanya) di antaranya adalah definisi lambda yang tepat.

JS jelas bukan bahasa pertama yang mendukung fitur ini. Berangkat dari ingatan, saya pikir itu adalah percakapan kecil yang selalu dipuji oleh para penggemar bahasa tentang mendukung lambda.

BTW: Di Jawa, kelas anonim biasanya digunakan untuk meneruskan definisi kelas dengan cepat untuk sebuah argumen (digunakan banyak dalam ayunan). Sesuatu seperti ini (dari memori, tidak dikompilasi):

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

Memperbarui

Java, pada 8, sekarang secara resmi menjadi bahasa Lambda.

Anda sekarang dapat menggunakan sintaks berikut:

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

Sumber Kode

mtyson
sumber
1

Dalam kursus terbuka MIT yang disebut struktur dan interpretasi program komputer sebuah buku oleh Hal Abelson, Jerry Sussman dan Julie Sussman. Mereka membahas Skema, yang merupakan dialek dari LISP dan di sana mereka menjelaskan penjelasan yang sangat rinci dan jelas tentang apa itu lambda dan Skema LISP dan bahasa secara umum. Saya sangat menyarankan Anda melihatnya jika Anda ingin memiliki pemahaman yang benar-benar jelas dan mendalam tentang Pemrograman Komputer. Untuk menjelaskan kepada Anda akan memakan waktu tiga kali lebih banyak daripada jika Anda pergi ke sana dan hanya membaca buku atau menonton tutorial yang menjelaskannya dengan sempurna, itu jenius.

Javascript terutama didasarkan pada Skema bahasa dan itu adalah ayah Lisp, dan sebagai tambahan ia mengambil struktur lamda dan menjadi arus utama dengannya.

Max
sumber
0

Dari wikipedia: Dalam bahasa pemrograman seperti Lisp dan Python, lambda adalah operator yang digunakan untuk menunjukkan fungsi atau penutupan anonim, mengikuti penggunaan kalkulus lambda. Contoh penggunaan lambda dalam bahasa Python ini adalah bagian kode komputer ini yang mengurutkan daftar menurut abjad dengan karakter terakhir dari setiap entri:

>>> 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
sumber
0
  • JavaScript memungkinkan untuk mendefinisikan fungsi Anonim yaitu fungsi yang tidak terikat pada pengenal. Fungsi seperti itu juga dikenal sebagai Abstraksi Lambda dan karena JS mendukungnya, ini dikenal sebagai Bahasa Lambda.

  • Properti: Fungsi ini diperlukan dalam kasus eksekusi segera dari suatu fungsi atau untuk penggunaan jangka pendek, di mana tidak ada arti penting memberi nama pada fungsi.

  • Ini berbeda dari bahasa seperti Java, C, C ++ dan PHP seperti dalam fungsi JS Anonymous yang digunakan untuk Closure dan Currying.

MERLIN THOMAS
sumber