什么是lambda语言?

我正在阅读“JavaScript:The Good Parts”,作者提到JavaScript是第一个要发布的lambda语言。

JavaScript的函数是带有(主要)词法作用域的第一类对象。 JavaScript是第一个成为主stream的lambda语言 。 在深层次上,JavaScript与Lisp和Scheme比Java更有共同之处。 C的衣服是Lisp。 这使JavaScript成为非常强大的语言。

我没有得到什么是lambda语言。 这种语言的属性是什么,它与Java,C,C ++和Php等语言有什么不同?

我从来没有听说过任何人使用“lambda语言”这个词,而我能想到的唯一合理的定义就是将JavaScript排除在外。

这就是说,我怀疑他可能是指:

  • 函数式语言:计算(或可以)作为(可能更高阶的)函数的无状态组成的一类语言。 LISP,Scheme,ML,Haskell等经常被归为这一类,尽pipe其中的几个是更恰当的混合范式或“function可选”语言。 Javascript可以说包含必要的function,使编程的“function风格”成为可能。
  • 允许创build匿名函数的语言(在JavaScript中使用function语法;这是在许多语言中编写的lambda ,因此可能是“lambda语言”。

这两种用法都源于希腊字母lambda的使用,以表示lambda演算中的函数抽象,Alonzo Churchdevise的计算模型以及函数编程的基础。

编辑:看着谷歌图书的结果—“首先要走主stream”; 好吧,这是有争议的。 我提出LISP至less是一个合理的主stream。 这是一个公平的观点,JavaScript的语义直接受到了Scheme的启发,并且它比其他任何能够做出类似主张的语言都能得到更多的读者。

简而言之,lambda语言是一种允许将函数传递给另一个函数的语言,函数被视为任何其他variables。 此外,你应该能够定义这个函数匿名(或内联)传递。 PHP 5.3增加了对lambda函数的支持。 JavaScript是第一个主stream语言吗? 在JavaScript之前,Lisp已被广泛用于教育环境,并且还定制了我们心爱的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之前),为了达到同样的效果,你必须传递一个实现了接口的对象,实际上它可以被匿名定义。

他提到了Lambda微积分 。

Lambda演算,也写作λ演算,是一个正式的函数定义,函数应用和recursion系统。 […]

无types的lambda演算是函数式编程的最初灵感,特别是Lisp,以及作为现代types系统的基础的typeslambda calculi。

我见过一个lambda被定义为一个匿名函数和一个函数的引用。 Javascript同时支持:

 setTimeout(function(){ /* an anonymous function */ }, 100) var f = function(){ /* function ref */ } 

这是JS获得其大量权力和灵活性的地方。 Java在某种程度上支持(匿名接口实现), 但不支持后者 – 请参阅下面的Java 8更新。

我不清楚哪一个(或两者)是lambda的正确定义。

JS绝对不是支持这些function的第一语言。 从记忆的angular度来看,我认为语言爱好者总是热衷于支持lambdas。

顺便说一句:在Java中,匿名类通常用于传递一个参数的类定义(在swing中使用很多)。 像这样(从内存,不编译):

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

更新

截至8日,Java正式成为Lambda语言。

您现在可以使用以下语法:

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

代码来源

在麻省理工学院的开放课程中,称为结构和计算机程序的解释,是由哈尔·贝尔森,杰里·苏斯曼和朱莉·苏斯曼的书组成的。 他们讨论Scheme,这是LISP的一种方言,在那里他们解释了什么是lambda和Scheme LISP和语言的一个非常详细和清晰的解释。 如果你想对计算机编程有一个非常清楚和深刻的理解,我强烈build议你看看它。 向你解释会花费你三倍的时间,就好像你去了那里,只是读了那本书,或者看了那些完美解释的教程,这才是天才。

Javascript主要是基于语言Scheme,它是Lisp的父亲,另外它采用了lamda结构,并成为主stream。

在wikipedia中:在诸如Lisp和Python之类的编程语言中,lambda是一个用于表示匿名函数或闭包的运算符,遵循lambda演算。 在Python语言中使用lambda的一个例子是计算机代码的这一部分,它按照每个条目的最后一个字符按字母顺序对列表进行sorting:

 >>> 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 
  • JavaScript允许定义匿名函数,这是一个不绑定到标识符的函数。 这样的函数也被称为Lambda抽象,因为JS支持这个函数,所以它被称为Lambda语言。

  • 属性:在函数立即执行或短期使用时,需要使用此函数,而函数名称没有任何意义。

  • 它与JS,Java,C,C ++和PHP等语言不同,Anonymous函数用于Closure和Currying。