2010-10-05 33 views
82

我在閱讀「JavaScript:The Good Parts」,作者提到JavaScript是第一個要發佈的lambda語言。什麼是拉姆達語言?

JavaScript的函數是帶有(主要是)詞法作用域的第一類對象。 JavaScript是第一個lambda語言成爲主流。在深層次方面,JavaScript與Lisp和Scheme比Java更有共同之處。它是C的服裝中的Lisp。這使JavaScript成爲非常強大的語言。

我沒有得到什麼是lambda語言。這種語言的屬性是什麼,它與Java,C,C++和Php等語言有什麼不同?

+6

Lambda表示匿名錶達式。所以lambda語言 - >使用匿名錶達式的語言 – bevacqua 2010-10-05 15:49:03

+0

Google圖書鏈接,FYI:http://books.google.co.uk/books?id=PXa2bby0oQ0C&pg=PA3&lpg=PA3&dq=lambda+language+crockford&source=bl&ots=HHtnnar4jI&sig=EmkjJCBHLOn5shPtgKzaZ_tQ4xg&hl= en&ei = okirTMyYGoqQjAfxuL3qBw&sa = X&oi = book_result&ct = result&resnum = 2&ved = 0CBkQ6AEwAQ#v = onepage&q = lambda%20language&f = false – 2010-10-05 15:49:07

+3

請參閱wikipedia上的[lambda微積分](http://en.wikipedia.org/wiki/Lambda_calculus)。 – Oded 2010-10-05 15:50:10

回答

34

我從來沒有聽說過任何人使用過「lambda語言」這個術語,而我能想到的唯一合理的定義就是將JavaScript排除在外。

這就是說,我懷疑他可以意指:

  • 功能的語言:一類的語言,其中的計算是(或可以被)建模爲(可能高階)函數的無狀態的組合物。 LISP,Scheme,ML,Haskell等經常被歸入這個類,儘管其中有些是更恰當的混合範式或「功能可選」語言。 Javascript可以說包含了使編程的「功能風格」成爲可能的必要特性。
  • 語言,其允許匿名函數(使用在JavaScript中function語法的創建;這在許多語言書面lambda,從而有可能「拉姆達語言。」

兩次使用都是從用希臘的衍生字母lambda表示lambda演算中的函數抽象,Alonzo Church設計的計算模型以及函數編程的基礎。

編輯:看着谷歌圖書的結果---「首先要走主流」;好吧,這是有爭議的,我提出LISP至少是一個合理的主流,儘管這是一個公平點,JavaScript的語義直接受到Scheme的啓發,並且它比任何能夠做出類似主張的其他語言都能獲得更多的受衆。

+0

請參閱Lucas Jones Google書鏈接發佈的鏈接,他將它帶到我正在討論的確切頁面。感謝你的回答。 – 2010-10-05 15:53:38

+5

JavaScript被描述爲'第一'的原因是因爲該聲明符合'走向主流'的條件。我認爲很明顯,JavaScript確實是日常工作中日常程序員使用的第一種功能風格的語言。 – rfunduk 2010-10-05 15:55:19

+1

當你說「功能風格」的編程語言時,你是什麼意思。我來自Java背景,並試圖學習JavaScript,它有什麼不同。 – 2010-10-05 16:02:05

0

來自維基百科: 在諸如Lisp和Python之類的編程語言中,lambda是一個用於表示匿名函數或閉包的運算符,遵循lambda演算。在Python語言的這種使用拉姆達的一個例子是計算機代碼的這一部分,通過每個條目的最後一個字符的字母順序排列的列表:

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

他指Lambda calculus

λ演算,也寫成λ演算,是函數定義,函數應用和遞歸的形式化系統。 [...]

無類型lambda微積分是函數式編程的最初靈感,特別是Lisp和鍵入的lambda calculi作爲現代類型系統的基礎。

46

簡而言之,lambda語言是一種允許將函數傳遞給另一個函數的語言,該函數被視爲任何其他變量。此外,您應該能夠定義此功能以匿名(或內聯)方式傳遞。 PHP 5.3增加了對lambda函數的支持。 JavaScript是第一種主流語言嗎? Lisp語言已被廣泛應用於在JavaScript之前的教育環境,並在定製我們敬愛的Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/

下面是一個例子

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有什麼不同?在C中,可以將指針傳遞給函數,但不能將其定義爲匿名內聯。

在Java中(在版本8之前),爲了達到相同的效果,您必須傳遞一個實現了接口的對象,實際上它可以以匿名方式內聯定義。

+1

「Lisp被誰廣泛使用」?我一直都知道,因爲教授們總是會討論它,但在實踐中,我從來沒有見過任何使用過Lisp的人。我會說任何人都可以找到他們認識的人使用JavaScript,這使得JavaScript更「主流」。 – palswim 2010-10-05 22:44:32

+0

「PHP 5增加了對lambda函數的支持」。其實iy是PHP 5。3引入了lambda函數。 – Crozin 2010-10-05 23:08:43

+0

我遇到過很少有人在商業環境中使用過它,但像帕斯卡爾曾經那樣,它在教育環境中被廣泛使用。 – 2010-10-05 23:31:02

4

我見過一個lambda被定義爲一個匿名函數和一個函數的引用。 Javascript同時支持:

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

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

這就是JS獲得其大量權力和靈活性的地方。 Java支持第一至一定程度(匿名接口的實現), 而不是後者 - 見下面的更新的Java 8.

及其我不清楚哪個(或兩者)的這些是λ的適當定義。

JS絕對不是支持這些功能的第一語言。從記憶的角度來看,我認爲語言愛好者總是熱衷於支持lambdas。在Java中,一個匿名類通常用於傳遞一個類定義,用於一個參數(在swing中使用很多)。像這樣的事情(從內存中,沒有編譯):

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

更新

的Java,截至8,現已正式拉姆達語言。

您現在可以使用下面的語法:

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

Code Source

+1

感謝實用的'網絡相關'參考。 – 2014-12-15 17:36:32

+1

清除了所有的疑惑.. – 2016-12-13 07:12:19

1

在麻省理工學院的開放式課程潔具稱爲結構和計算機程序的書解釋哈爾阿伯爾森的傑裏·蘇斯曼的和朱莉蘇斯曼的。他們討論Scheme,這是LISP的一種方言,在那裏他們解釋了什麼是lambda以及Scheme LISP和語言的一個非常詳細和清晰的解釋。如果你想對計算機編程有一個非常清晰和深刻的理解,我強烈建議你看看它。向你解釋會花費三倍的時間,就好像你去了那裏,只是讀了這本書,或者看了那些完美解釋它的教程,這纔是天才。

Javascript主要基於語言Scheme,它是Lisp的父親,此外它採用了lamda結構,併成爲主流。

0
  • JavaScript允許定義匿名函數,該函數是一個未綁定到標識符的函數。這個函數也被稱爲Lambda抽象,並且由於JS支持它,所以它被稱爲Lambda語言。

  • 屬性:該功能在需要立即執行功能或短期使用的情況下需要,其中沒有賦予功能名稱的重要性。

  • 它與JS,Java,C,C++和PHP等語言不同,正如JS中的一樣。Anonymous函數用於Closure和Currying。