Javascript 什么是 lambda 语言?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3865335/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What is a lambda language?
提问by sushil bharwani
I was reading "JavaScript: The Good Parts" and the author mentions that JavaScript is the first of the lambda languages to be launched.
我正在阅读“JavaScript: The Good Parts”,作者提到 JavaScript 是第一个推出的 lambda 语言。
JavaScript's functions are first class objects with (mostly) lexical scoping. JavaScript is the first lambda languageto go mainstream. Deep down, JavaScript has more in common with Lisp and Scheme than with Java. It is Lisp in C's clothing. This makes JavaScript is remarkably powerful language.
JavaScript 的函数是具有(主要)词法范围的一流对象。JavaScript 是第一个成为主流的lambda 语言。在内心深处,与 Java 相比,JavaScript 与 Lisp 和 Scheme 的共同点更多。它是披着 C 语言的 Lisp。这使得 JavaScript 成为非常强大的语言。
I didn't get what is a lambda language. What are the properties of such a language and how is it different from languages like Java, C, C++ and Php?
我没有明白什么是 lambda 语言。这种语言的特性是什么?它与 Java、C、C++ 和 Php 等语言有何不同?
采纳答案by Derrick Turk
I've never heard anyone use the term "lambda language," and the only plausible definitions I can think of would exclude JavaScript as "the first."
我从来没有听说过有人使用“lambda 语言”这个词,我能想到的唯一合理的定义是将 JavaScript 排除在“第一个”之外。
That said, I suspect he may mean either:
也就是说,我怀疑他的意思可能是:
- Functional languages: a class of languages in which computation is (or can be) modeled as a stateless composition of (possibly higher-order) functions. LISP, Scheme, ML, Haskell, etc. are frequently ascribed to this class, although several of these are more properly mixed paradigm or "functional optional" languages. Javascript arguably contains the necessary features to make a "functional style" of programming possible.
- Languages which allow the creation of anonymous functions (using the
function
syntax in JavaScript; this is writtenlambda
in many languages, hence possibly "lambda languages."
- 函数式语言:一类语言,其中计算被(或可以)建模为(可能是高阶)函数的无状态组合。LISP、Scheme、ML、Haskell 等经常归于此类,尽管其中一些是更合适的混合范式或“功能可选”语言。Javascript 可以说包含使“函数式”编程成为可能的必要特性。
- 允许创建匿名函数的语言(使用
function
JavaScript 中的语法;这是用lambda
多种语言编写的,因此可能是“lambda 语言”。
Both usages are derived from the use of the greek letter lambda to denote function abstraction in the lambda calculus, the model of computation devised by Alonzo Church and upon which functional programming is based.
这两种用法都源自使用希腊字母 lambda 来表示 lambda 演算中的函数抽象,这是 Alonzo Church 设计的计算模型,函数式编程基于该模型。
Edit: looked at Google Books result---"first to go mainstream"; well, that's arguable. I'd put forward that LISP was at one point at least reasonably mainstream. It's a fair point though, JavaScript's semantics are directly inspired by Scheme and it certainly reached a larger audience than any other language that can make similar claims.
编辑:查看谷歌图书结果---“第一个走向主流”;嗯,这是有争议的。我曾提出 LISP 在某一时刻至少是相当主流的。不过,这是一个公平的观点,JavaScript 的语义直接受到 Scheme 的启发,并且它的受众肯定比任何其他可以做出类似声明的语言都要多。
回答by Juan Mendes
A lambda language, in simple terms, is a language that allows passing a function to another function, where the function is treated as any other variable. Also, you should be able to define this function to be passed anonymously (or inline). PHP 5.3 added support for lambda functions. Was JavaScript the first mainstream language? Lisp has been widely used in educational settings before JavaScript and also in customizing our beloved Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/
简单来说,lambda 语言是一种允许将函数传递给另一个函数的语言,其中该函数被视为任何其他变量。此外,您应该能够定义此函数以匿名(或内联)传递。PHP 5.3 添加了对 lambda 函数的支持。JavaScript 是第一个主流语言吗?在 JavaScript 之前,Lisp 已广泛用于教育环境,也用于定制我们心爱的 Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/
Here's an example
这是一个例子
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})
How is it different from C? In C, you can pass pointer to functions, but you can't define it inline anonymously.
它与 C 有何不同?在 C 中,您可以将指针传递给函数,但不能匿名内联定义它。
In Java (before version 8), to achieve the same effect, you must pass an object that implements an interface, which actually can be defined anonymously inline.
在Java(版本8之前)中,要达到同样的效果,必须传递一个实现接口的对象,实际上可以匿名内联定义。
回答by BenoitParis
He refers to Lambda calculus.
他指的是Lambda 演算。
Lambda calculus, also written as λ-calculus, is a formal system for function definition, function application and recursion. [...]
[...] with untyped lambda calculus being the original inspiration for functional programming, in particular Lisp, and typed lambda calculi serving as the foundation for modern type systems.
Lambda 演算,也写作λ-演算,是一个用于函数定义、函数应用和递归的形式化系统。[...]
[...] 无类型 lambda 演算是函数式编程(尤其是 Lisp)的原始灵感,而类型化 lambda 演算则是现代类型系统的基础。
回答by mtyson
I've seen a lambda defined as an anonymous function and as a reference to a function. Javascript supports both:
我见过一个 lambda 被定义为匿名函数和对函数的引用。Javascript 支持:
setTimeout(function(){ /* an anonymous function */ }, 100)
var f = function(){ /* function ref */ }
This is where JS gets a lot of its power and flexibility. Java supports the first to some extent (anonymous interface implementations), but not the latter- see below for update for Java 8.
这是 JS 获得强大功能和灵活性的地方。Java 在一定程度上支持第一个(匿名接口实现),但不支持后者- 有关 Java 8 的更新,请参见下文。
Its unclear to me which (or both) of these is the proper definition of a lambda.
我不清楚其中哪一个(或两个)是 lambda 的正确定义。
JS is definitely not the first language to support these features. Going from memory, I think its smalltalk that language enthusiasts always rave about supporting lambdas.
JS 绝对不是第一种支持这些特性的语言。根据记忆,我认为语言爱好者总是热衷于支持 lambda 表达式。
BTW: In Java, an anonymous class is usually used to pass in a class definition on the fly for an argument (used a lot in swing). Something like this (from memory, not compiled):
顺便说一句:在 Java 中,匿名类通常用于为参数动态传递类定义(在 Swing 中经常使用)。像这样的东西(来自记忆,未编译):
someGuiContainer(new WidgetInterface()
{
public void importantMethodToDefine(){
// Handle having the method called in my special widget way
}
}
)
Update
更新
Java, as of 8, is now officially a Lambda language.
从 8 开始,Java 现在正式成为 Lambda 语言。
You can now use the following syntax:
您现在可以使用以下语法:
MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
回答by Max
In MIT's open course-ware called structure and interpretation of computer programs a book by Hal Abelson's, Jerry Sussman's and Julie Sussman's. They discuss Scheme, which is a dialect of LISP and there they explain a very detailed and clear explanation of what lambda is and Scheme LISP and languages in general. I highly recommend you look at it if you wish to have a really clear and deep understanding of Computer Programming. To explain to you would take three times as much time as if you went there and just read the book or watch the tutorials which explains it perfectly, it's genius.
在麻省理工学院的名为“计算机程序的结构和解释”的公开课件中,有一本由 Hal Abelson、Jerry Sussman 和 Julie Sussman 合着的书。他们讨论了 Scheme,它是 LISP 的一种方言,并在那里对 lambda 是什么以及 Scheme LISP 和语言进行了非常详细和清晰的解释。如果你想对计算机编程有一个真正清晰和深刻的理解,我强烈建议你看看它。向您解释所花的时间是您去那里阅读书籍或观看完美解释的教程所花时间的三倍,这是天才。
Javascript is mainly based off of the language Scheme and it's Lisp father, and in addition it took its lamda structure and went mainstream with it.
Javascript 主要基于语言 Scheme 和它的 Lisp 之父,此外它还采用了 lamda 结构并成为主流。
回答by MERLIN THOMAS
JavaScript allows to define Anonymous function that is a function which is not bound to an identifier. Such function is also known as Lambda Abstraction and since JS support this it is known as Lambda Language.
Properties : This function are needed in case of immediate execution of a function or for short term use, where there is no significance of giving name to function.
It is different from languages like Java, C, C++ and PHP as in JS Anonymous functions are used for Closure and Currying.
JavaScript 允许定义匿名函数,该函数是未绑定到标识符的函数。此类函数也称为 Lambda 抽象,由于 JS 支持它,因此称为 Lambda 语言。
属性:在立即执行函数或短期使用的情况下需要此函数,在这种情况下,给函数命名没有意义。
它与 Java、C、C++ 和 PHP 等语言不同,因为在 JS 中匿名函数用于闭包和柯里化。
回答by r3nrut
From wikipedia: In programming languages such as Lisp and Python, lambda is an operator used to denote anonymous functions or closures, following the usage of lambda calculus. An example of this use of lambda in the Python language is this section of computer code that sorts a list alphabetically by the last character of each entry:
来自维基百科:在 Lisp 和 Python 等编程语言中,lambda 是一个运算符,用于表示匿名函数或闭包,遵循 lambda 演算的用法。在 Python 语言中使用 lambda 的一个例子是这部分计算机代码,它按每个条目的最后一个字符按字母顺序对列表进行排序:
>>> 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