1

Lisp 很早就在学术界开发了一组有趣的语言特性,但其中大多数从未在生产环境中流行起来。

一些语言,比如 JavaScript,适应了垃圾收集和词法闭包等基本特性,但所有可能真正改变大规模编写程序方式的东西,比如强大的宏、代码即数据和自定义控制结构,只是似乎在其他函数式语言中传播,这些语言都不适用于非平凡的项目。

函数式编程社区还提出了许多其他有趣的想法(除了函数式编程本身),例如引用透明性、通用大小写表达式(即模式匹配,不像 C/C# 开关那样残缺不全)和柯里化函数,这似乎在常规编程中显然很有用,并且应该很容易与现有的编程实践集成,但由于某种原因似乎永远停留在学术界。

为什么这些功能很难被采用?是否有任何现代实用的语言实际上从 Lisp 中学习,而不是半途而废地复制“一流的功能”,或者是否存在使这不可能的内在冲突?

4

16 回答 16

21

是否有任何现代实用的语言实际上从 Lisp 中学习,而不是半途而废地复制“一流的功能”,或者是否存在使这不可能的内在冲突?

为什么 lisp、haskell、ocaml 或 f# 不是现代的?

您可能只需要自己承担并查看它们并意识到它们更健壮,使用像 java 这样的库,然后您会想。

许多功能已从功能语言应用到其他语言。但反之亦然——例如,(某些)函数式语言具有对象。

于 2008-09-16T19:00:49.997 回答
8

Scala是一种很酷的函数式/OO 语言,具有模式匹配、一等函数等。它具有编译成 Java 字节码的优点,并且与 Java 代码的互操作性很好。

于 2008-09-16T18:18:50.927 回答
8

我建议你试试Clojure。语法优美的方言、功能性(在 ML 意义上)和快速。您将获得不变性、软件事务内存、多版本并发控制、REPL、SLIME 支持和取之不尽的 FFI。它是商业程序员的 Lisp (& Haskell)。在我的实际工作中,我每天都在使用它,度过了愉快的时光。

于 2008-09-16T22:52:48.740 回答
8

语言“流行”与是否具有强大的、经过充分研究的、精心设计的特性之间没有已知的相关性。

关于这个问题已经说了很多。它存在于技术和艺术中的所有地方。我们知道艺术家 A 比艺术家 B 受过更多培训,创作的作品更广、更深入,但艺术家 B 在市场上更成功。是因为有时代精神吗?是因为艺人B有更好的营销吗?是因为大多数人不会花时间去了解艺术家A吗?也许艺术家B暗地里很糟糕,我们应该不相信对艺术家做出判断的专家?可能以上所有,在某种程度上。

这让学习艺术的人和学习编程语言的人疯狂。

于 2008-09-17T01:40:53.453 回答
7

Common Lisp,在现实世界中使用,虽然不是很疯狂,我猜。

于 2008-09-16T19:55:41.643 回答
6

蟒蛇或红宝石。请参阅 Paul Graham在“我喜欢 Lisp 但我的公司不让我使用它。我应该怎么做?”的问题中对此的看法。

于 2008-09-16T18:34:52.727 回答
5

Scala 是采用重要学术特征的语言的绝对王者。高级种类、自类型、多态模式匹配等。所有这些都是前沿(或接近它)的学术研究主题,已作为基本特性纳入 Scala。可以说,这有损于语言的简单性,但它确实导致了一些非常有趣的模式。

C# 比 Scala 更主流,但它也很少采用这些“外在”的功能特性。LINQ 是 Wadler 的广义列表推导的有限实现,每个人都知道 lambda。但尽管如此,C#(理所当然地)在采用学术界的研究特征方面仍然有点保守。

于 2008-09-16T19:59:55.113 回答
5

Erlang 最近获得了新的曝光,不仅通过 Twitter 使用,还通过 XMPP 驱动的消息传递和 ejabberd 等实现的兴起。它体现了许多来自函数式编程的想法,这是一种在设计时考虑到这一点的语言。最初用于运行电话交换机,并由爱立信构思运行第一个 GSM 网络。它仍然存在,功能齐全(作为一种语言)并在许多生产环境中使用。

于 2008-09-16T20:07:42.817 回答
3

卢阿。

它被用作许多游戏(如魔兽世界)和应用程序(Snort、NMAP、Wireshark 等)的脚本/扩展语言。事实上,根据 Adob​​e 开发人员的说法,Adobe 的 Lightroom 超过 40% 是 Lua。

Lua 背后的家伙多次将 Scheme 和 Lisp 列为对 Lua 的主要影响,Lua 甚至被描述为没有括号的 Scheme。

于 2008-09-16T18:47:21.950 回答
2

你检查过F#

于 2008-09-16T18:19:14.777 回答
2

许多动态编程语言实现了函数式编程的想法。较新的 .Net 语言(C# 和 VB)具有他们所谓的 lambda,但它们并非没有副作用。

例如,将函数式编程和面向对象编程的概念结合起来并不难,但它并不总是很有意义。面向对象的语言(尝试)将状态封装在对象内,而函数式语言将状态封装在函数内。如果你用一种语言结合对象和函数,就很难理解这一切。

已经有很多语言通过将这些范式组合在一起(F#)来组合这些范式,这可能很有用,但我认为我们仍然需要几十年的时间来使用这样的语言,直到我们可以创建一个成功的新范式将结合 oo 和函数式编程的思想。

于 2008-09-16T18:23:53.643 回答
2

C# 3.0 肯定可以。

C# 现在有

  1. Lambda 表达式
  2. 高阶函数
  3. 映射/减少 + 过滤器(折叠?)到列表和所有实现 IEnumerable 的类型。
  4. LINQ
  5. 对象 + 集合初始化器。

最后两个列表项可能不属于正确的函数式编程,无论如何答案是 C# 已经实现了许多来自 Lisp 等的有用概念。

于 2008-09-16T18:27:16.083 回答
2

除了上面所说的,很多 LISP 的优点是基于保证没有副作用和使用内置的数据结构。两者都很少在现实世界中成立。ML 可能是更好的功能基础。

于 2008-09-16T20:11:45.693 回答
2

Lisp 很早就在学术界开发了一组有趣的语言特性,但其中大多数从未在生产环境中流行起来。

因为管理软件开发人员的那种人不是那种你可以与之进行有趣聊天比较不同语言功能的人。大约在 2000 年,我想使用 LISP 在我们的公司网站上实现 XML 到 HTML 的转换(这大约是亚马逊在 LISP 中实现后端的时候)。我没来得及。看到我工作的公司制造和销售Common LISP 环境,这有点讽刺。

于 2008-10-19T11:00:18.190 回答
1

另一种实现函数式编程特性的“现实世界”语言是 Javascript。既然绝对一切都有价值,那么高阶函数很容易实现。您还拥有函数式编程的其他租户,例如 lambda 函数、闭包和柯里化。

于 2008-10-09T16:38:46.077 回答
0

您所指的功能(“强大的”宏、代码即数据和自定义控制结构)尚未在其他功能语言中传播。在 Lisp 告诉我们它们是个坏主意后,它们就死了。

现代函数式语言(OCaml、Haskell、Erlang、Scala、F#、C# 3.0、JavaScript)没有这些特性。

干杯,乔恩·哈罗普。

于 2008-10-19T09:58:18.877 回答