Lambda dili nedir?


90

"JavaScript: The Good Parts" ı okuyordum ve yazar JavaScript'in başlatılacak ilk lambda dilleri olduğundan bahsediyor.

JavaScript'in işlevleri, (çoğunlukla) sözcük kapsamına sahip birinci sınıf nesnelerdir. JavaScript, genel kullanıma giren ilk lambda dilidir . Derinlemesine, JavaScript'in Lisp ve Scheme ile Java ile olduğundan daha fazla ortak noktası vardır. C'nin giysisindeki Lisp. Bu, JavaScript'in oldukça güçlü bir dil olmasını sağlar.

Lambda dilinin ne olduğunu anlamadım. Böyle bir dilin özellikleri nelerdir ve Java, C, C ++ ve Php gibi dillerden farkı nedir?


6
Lambda, anonim ifade anlamına gelir. Yani lambda dili -> anonim ifadelerle dil
bevacqua

Google Kitaplar bağlantısı, Bilginize: books.google.co.uk/…
Lucas Jones

3
Wikipedia'da lambda hesabına bakın .
Oded

çok güzel cevaplar. Şimdiye kadar anladığım şey, anonim bir işlev kullanıyorsanız, lambda dili üzerinde çalışıyorsunuzdur. lamda dillerinin java gibi dillerden ne kadar farklı olduklarını doğru anlamaktır.
sushil bharwani

4
"'JavaScript: The Good Parts' okuyordum ve yazar, JavaScript'in başlatılacak ilk lambda dilleri olduğundan bahsediyor." Bu yüzden, lambda dilini araştırdım ve bu soruyu SO'da buldum :)
Bugs Bunny

Yanıtlar:


38

Hiç kimsenin "lambda dili" terimini kullandığını duymadım ve aklıma gelen tek mantıklı tanım JavaScript'i "ilk" olarak hariç tutuyor.

Bununla birlikte, ikisinden birini kastettiğinden şüpheleniyorum:

  • İşlevsel diller: Hesaplamanın, işlevlerin (muhtemelen daha yüksek düzeyli) bir durumsuz bileşimi olarak modellendiği (veya olabileceği) bir dil sınıfı. LISP, Scheme, ML, Haskell, vb. Sık sık bu sınıfa atfedilir, ancak bunlardan birkaçı daha uygun şekilde karışık paradigma veya "işlevsel isteğe bağlı" dillerdir. Javascript, muhtemelen programlamanın "işlevsel stilini" mümkün kılmak için gerekli özellikleri içerir.
  • Anonim işlevlerin oluşturulmasına izin veren diller ( functionJavaScript'teki sözdizimini kullanarak ; bu yazılırlambda birçok dilde , dolayısıyla muhtemelen "lambda dilleri").

Her iki kullanım da, Alonzo Kilisesi tarafından tasarlanan ve fonksiyonel programlamanın dayandığı hesaplama modeli olan lambda hesaplamasındaki fonksiyon soyutlamasını belirtmek için Yunan harfli lambda'nın kullanımından türetilmiştir.

Düzenleme: Google Kitaplar sonucuna bakıldı --- "önce ana akıma geçecek"; iyi, bu tartışılabilir. LISP'nin bir noktada en azından makul ölçüde yaygın olduğunu ileri sürmüştüm. Gerçi bu adil bir nokta, JavaScript'in anlambilimi doğrudan Scheme'den ilham alıyor ve kesinlikle benzer iddialarda bulunabilecek diğer dillerden daha geniş bir kitleye ulaştı.


lütfen tam olarak bahsettiğim sayfaya götürdüğü Lucas Jones tarafından yayınlanan Google kitap bağlantısına bakın. cevabın için teşekkürler
sushil bharwani

5
JavaScript'in 'ilk' olarak tanımlanmasının nedeni, ifadenin 'ana akıma gitmek' ile nitelendirilmesidir. JavaScript'in gerçekten de günlük işlerde günlük programcılar tarafından kullanılan ilk işlevsel stil dil olduğu çok açık.
rfunduk

1
programlama dilinin "işlevsel tarzı" derken neyi kastediyorsunuz? Ben bir java geçmişinden geliyorum ve javascript'in nasıl farklı olduğunu öğrenmeye çalışıyorum.
sushil bharwani

9
Keşfedilmesi gereken çok büyük bir konu. Geçen yıl şu an bulunduğun yerdeydim: Crockford'un denemelerini ve derslerini bulmuştum ve kapanışları anlamak istedim. Wikipedia ile başlamanızı, ardından birkaç denemeye geçmenizi tavsiye ederim: John Hughes "Neden İşlevsel Programlama Önemlidir" scribd.com/doc/26902/whyfp , Slava Akhmechet "Geri kalanımız için İşlevsel Programlama" defmacro.org/ramblings /fp.html Zihninizi genişletecek çok sayıda kitap var: Şema hakkında bir fikir edinmek için Küçük Düzenleyiciye bakın ve ardından Bilgisayar Programlarının Yapısı ve Yorumlanması'na geçin.
michiakig

5
@sushil: Konuyla ilgili birçok giriş literatürü var. Genel anlamda, programların sıralı talimatlar veya soyut nesneler arasındaki etkileşimler yerine matematiksel nesneler olarak ele alınmasını vurgulayan bir programlama tarzıdır. Örneğin, işlevsel diller yinelemeyi yinelemeye tercih edecek, değişmez veri yapılarını kullanacak ve "işlev nesneleri" veya "strateji kalıpları" yerine daha yüksek dereceli işlevleri kullanacaktır. Daha yüksek sıralı işlevler, diğer işlevler üzerinde (bağımsız değişken olarak) çalışabilen veya (dönüş değerleri olarak) üreten işlevler anlamına gelir.
Derrick Turk

48

Basit terimlerle bir lambda dili, bir işlevi başka bir işleve geçirmeye izin veren ve işlevin başka bir değişken olarak ele alındığı bir dildir. Ayrıca, bu işlevi anonim olarak (veya satır içi) geçirilecek şekilde tanımlayabilmelisiniz. PHP 5.3, lambda işlevleri için destek ekledi. JavaScript ilk yaygın dil miydi? Lisp, JavaScript'ten önce eğitim ortamlarında ve ayrıca sevgili Emac'larımızı özelleştirmede yaygın olarak kullanılmıştır http://www.gnu.org/software/emacs/manual/html_node/eintr/

İşte bir örnek

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

C'den farkı nedir? C'de, işaretçiyi işlevlere geçirebilirsiniz, ancak onu anonim olarak satır içi tanımlayamazsınız.

Java'da (sürüm 8'den önce), aynı etkiyi elde etmek için, aslında anonim olarak satır içi olarak tanımlanabilen bir arabirim uygulayan bir nesne iletmelisiniz.


1
"Lisp yaygın olarak kimler tarafından kullanılmaktadır"? Profesörler her zaman tartışacağı için bunu her zaman biliyordum, ancak pratikte Lisp kullanan biriyle hiç tanışmadım. Herkesin Javascript'i kullanan tanıdığı birini bulabileceğini söyleyebilirim, bu da Javascript'i çok daha "ana akım" yapar.
palswim

"PHP 5, lambda işlevleri için destek ekledi". Aslında iy, lambda işlevlerini tanıtan PHP 5.3 idi.
Crozin

Bunu iş bağlamında kullanan birkaç kişiyle tanıştım, ancak bir zamanlar Pascal gibi, eğitim ortamlarında yaygın olarak kullanılıyor.
Juan Mendes

4

Lambda hesabına atıfta bulunuyor .

Λ-kalkülüs olarak da yazılan Lambda hesabı, fonksiyon tanımı, fonksiyon uygulaması ve özyineleme için resmi bir sistemdir. [...]

[...], özellikle Lisp olmak üzere fonksiyonel programlama için orijinal ilham kaynağı olan türlenmemiş lambda hesabı ve modern tip sistemlerin temelini oluşturan tipte lambda taşı ile.


4

Anonim bir işlev olarak ve bir işleve referans olarak tanımlanan bir lambda gördüm. Javascript her ikisini de destekler:

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

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

JS'nin gücünü ve esnekliğini fazlasıyla aldığı yer burasıdır. Java bir dereceye kadar ilkini destekler (anonim arayüz uygulamaları), ancak ikincisini desteklemez - Java 8 güncellemesi için aşağıya bakın.

Hangisinin (veya her ikisinin) lambda'nın doğru tanımı olduğu bana açık değil.

JS kesinlikle bu özellikleri destekleyen ilk dil değil. Hafızadan gidersek, bence dil meraklılarının her zaman lambdaları desteklemek konusunda övündükleri hakkında küçük bir konuşma.

BTW: Java'da, anonim bir sınıf genellikle bir argüman için anında sınıf tanımını geçirmek için kullanılır (çokça kullanılır). Bunun gibi bir şey (hafızadan, derlenmemiş):

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

Güncelleme

Java, 8 itibariyle artık resmi olarak bir Lambda dilidir.

Artık aşağıdaki sözdizimini kullanabilirsiniz:

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

Kod Kaynağı


1

MIT'nin bilgisayar programlarının yapısı ve yorumu adı verilen açık ders programında Hal Abelson's, Jerry Sussman ve Julie Sussman'ın bir kitabı. LISP'in bir lehçesi olan Scheme'i tartışıyorlar ve orada lambda'nın ne olduğu ve Scheme LISP ve genel olarak diller hakkında çok detaylı ve net bir açıklamayı açıklıyorlar. Bilgisayar Programcılığını gerçekten net ve derin bir şekilde anlamak istiyorsanız, ona bakmanızı şiddetle tavsiye ederim. Size açıklamak, sanki oraya gidip sadece kitabı okumanız ya da onu mükemmel bir şekilde açıklayan öğreticileri izlersiniz sanki üç kat daha fazla zaman alırdı, bu dahice.

Javascript esas olarak dil Scheme ve Lisp'in babasıdır ve ayrıca lamda yapısını alıp ana akım haline getirmiştir.


0

Wikipedia'dan: Lisp ve Python gibi programlama dillerinde lambda, lambda hesabının kullanılmasının ardından anonim işlevleri veya kapanmaları belirtmek için kullanılan bir operatördür. Python dilinde bu lambda kullanımına bir örnek, her bir girişin son karakterine göre bir listeyi alfabetik olarak sıralayan bilgisayar kodunun bu bölümüdür:

>>> 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, bir tanımlayıcıya bağlı olmayan bir işlev olan Anonim işlevi tanımlamaya izin verir. Bu tür işlev aynı zamanda Lambda Soyutlaması olarak da bilinir ve JS bunu desteklediğinden Lambda Dili olarak bilinir.

  • Özellikler: Bu işlev, bir işlevin hemen yürütülmesi durumunda veya işleve ad vermenin öneminin olmadığı kısa süreli kullanım için gereklidir.

  • Java, C, C ++ ve PHP gibi dillerden farklıdır, çünkü JS'deki Anonim işlevler Closure ve Currying için kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.