默认情况下,是否存在“变量”不可变(const,final等)的编程语言?
而且,为了使它变量,你需要声明一个额外的不可变限定符吗?
答案 0 :(得分:36)
Functional Programming范式的哲学强烈倾向于所有“变量”是不可变的,而“可变”变量只允许在极端情况下(即I / O)。因此,大多数函数式编程语言(如各种 Lisp 方言和 Haskell )(通常都会)强化不可变变量。当然,有些语言比其他语言提供更多的灵活性,但中心的范式/哲学仍然存在,这会阻碍它。
编辑:回复您的修改:
如果您正在寻找具有友好性的C语言常量,那么采用全新的编程范式并不是您的解决方案。在函数式编程中,一切是不可变的(在大多数情况下),并且您通常会看到一种全新的基本哲学和编程方法。
这个不是真的是一个解决方案,如果你想要的是更容易声明常量。
Edit2:回应那些支持我的人:
虽然我做得正确(我希望)回答提问者的问题,但我不确定这是一个答案,结果是有用的,因为他的新编辑/评论。但是,我希望可能会睁开眼睛看一个全新的编程世界=)
Edit3:这是函数式编程语言的Wikipedia's List:
这些语言中的大多数都有一些非功能异端的微小元素/影响;标有“纯粹功能性”的那些没有。
(据我所知,函数式编程语言是唯一通过哲学来鼓励不可变变量的语言。默认情况下,可能有一些语言具有不可变的变量,这些变量不是范式的功能。这个概念对我来说听起来很奇怪,但是鉴于广泛的,庞大的,大量的编程语言,我不能保证一个“永不”的声明。我只是说,据我所知,这是非常不可能的)
一位意见提供者建议 ADA 是一种势在必行/面向对象的编程语言,默认情况下使用不可变变量。
答案 1 :(得分:7)
是
Haskell和Erlang是两个例子。
答案 2 :(得分:6)
我能想到的最接近的模拟是Objective Caml。由let
绑定的变量总是不可变的,但结构的字段(在Caml中称为记录)仅在默认情况下是不可变的,并且可以将单个字段标记为mutable
。
在功能语言中,Objective Caml已被证明对C程序员非常有吸引力。 OCaml在语言和库中都有很多命令式构造,因此迁移路径并不那么奇怪。如果你真的想要对象和类系统,它们也在那里。
Microsoft的.NET语言F#是Objective Caml的后代,但是已经进行了很多更改以确保它是.NET语言,并且我没有被告知可变性。 但是,如果您想尝试使用函数式语言作为当前编程风格的相对较小的变化,您可能希望调查Objective Caml或F#。
答案 3 :(得分:5)
Clojure是一种Lisp方言,针对Java虚拟机专门处理不可变数据。
答案 4 :(得分:4)
XSLT中的所有变量可能只是不可变的。
答案 5 :(得分:2)
您可能想看看锈迹斑斑的东西。它是一种命令式语言,遵循函数式编程哲学surprisingly often。