有没有任何纯粹的功能方案或Lisps?

nic*_*ame 31 scheme haskell functional-programming referential-transparency

我已经使用了一些函数式编程语言,并且非常喜欢Lisps使用的s-expr语法(特别是Scheme).

我也看到了使用纯函数式语言的优势.因此:

是否有任何纯粹的功能方案(或一般的Lisps)?

jon*_*onr 24

新的Racket语言(以前称为PLT Scheme)允许您使用s表达式(实际上是任何语法)实现您喜欢的任何语义.基本语言是一种热切评估的,动态类型的方案变体,但是在顶部构建的一些值得注意的语言是惰性方案和称为父时间的功能性反应系统.

在Racket中制作纯函数语言的一种简单方法是采用基本语言,而不是提供任何改变状态的过程.例如:

#lang racket/base
(provide (except-out (all-from-out racket/base) set! ...more here...))
Run Code Online (Sandbox Code Playgroud)

构成一种没有的语言set!.


j-g*_*tus 15

我不相信有任何纯粹的功能性Lisps,但Clojure可能是最接近的.

Clojure的创造者Rich Hickey:

为什么我要编写另一种编程语言?基本上是因为我想要为并发而设计的Lisp for Functional Programming并且找不到它.

http://clojure.org/rationale

Clojure is functional, with immutable data types and variables, but you can get mutable behavior in some special cases or by dropping down to Java (Clojure runs on the JVM).

This is by design - another quote by Rich is

A purely functional programming language is only good for heating your computer.

See the presentation of Clojure for Lisp programmers.

  • "纯函数式编程语言只适用于加热计算机".大声笑! (7认同)
  • 但加热电脑也是副作用. (3认同)

Nor*_*sey 13

是否有任何纯粹的功能方案(或一般的Lisps)?

ACL2定理证明是一个纯Lisp语言.然而,它用于定理证明而不是编程,特别是它仅限于一阶程序.然而,它在其利基市场上取得了极大的成功.除此之外,它还获得了2005年ACM软件系统奖.


C. *_*ann 12

可能不是,至少不是玩具/概念证明之外的任何东西.请注意,即使Haskell是不是100%纯粹的功能-它拥有秘密逃生舱口,并在东西IO在这个词的一些痛苦,挥手感只是"纯".

那就是说,你真的需要一种纯粹的功能语言吗?您几乎可以使用任何语言编写纯功能代码,并且会带来不同程度的不便和低效率.

当然,承担普遍状态修改的语言会使保持纯粹的东西变得痛苦,所以也许你真正想要的是一种鼓励不变性的语言?在这种情况下,你可能会发现看看Clojure的哲学是值得的.这是一个Lisp,开机!

最后要注意的是,确实认识到Haskell的大部分"语法"都是厚厚的糖层.底层语言只不过是一个类型化的lambda演算,并没有什么能阻止你以这种方式编写所有代码.不过,你可能会从其他Haskell程序员那里得到有趣的外观.还有Liskell,但我不确定这些日子里的状态.

最后,实际的注意事项:如果你想要实际编写你想要使用的代码,而不仅仅是为了好玩而修补一些东西,你真的想要一个知道如何使用纯代码/不可变数据结构的聪明的编译器.

  • "IO中的任何东西都只是"纯粹的"在一些折磨的,挥手的"这个词"中.Conal是有争议的.更清晰的描述依赖于意识到IO描述了操作,并且可以做出明确的表示:http://citeseerx.ist.psu.edu/viewdoc/summary?doi = 10.1.1.13.9123 (15认同)
  • @Don Stewart:与实际的最终结果并没有太多的表述:"IO"总比没有好,但是如果有足够的反常意图,它会让你面对许多与不纯语言编码相同的陷阱和错误.Haskell提供的好处是,首先避免这种情况更容易.但这听起来并不像提问者,所以不用担心. (2认同)
  • 它不是"你可以用任何语言编写纯粹的功能代码".它是"这是一段不是由我编写的C代码,它纯粹是功能性的吗?" (2认同)

Don*_*art 6

不一致和不可扩展的语法

什么是"不一致"?

基于语法选择语言是很奇怪的.毕竟,学习语法需要几个小时 - 这只是所需投资的一小部分.

相比之下,重要的考虑因素,如速度,打字规则,可移植性,图书馆的广度,文档和社区,对您是否能够提高效率有更大的影响.

无视所有的火焰诱饵,快速google for immutable Scheme会产生一些结果:http: //blog.plt-scheme.org/2007/11/getting-rid-of-set-car-and-set-cdr.html


Anu*_*dha 5

30年前有lispkit lisp
不确定它今天是多么可访问.
[这是我学习函数式编程的地方之一]


Yef*_*itz 5

owl lisp,一种 R5RS 方案的方言,所有数据结构都是不可变的,还有一些额外的纯数据结构。这不是一个大项目,但似乎是由一小群人积极开发和使用的(从我在网站和 git 存储库上看到的)。还计划包括 R7RS 支持和某种类型推断。因此,虽然可能还没有准备好用于生产使用,但这可能是一件有趣的事情。