【发布时间】:2016-05-20 03:48:13
【问题描述】:
当 Erlang 不允许时,允许在 Elixir 中重新绑定变量的基本原理是什么?
【问题讨论】:
当 Erlang 不允许时,允许在 Elixir 中重新绑定变量的基本原理是什么?
【问题讨论】:
大多数函数式语言不允许在同一范围内重新绑定变量。所以 Elixir 允许这样做肯定会给它一种非功能性的、命令式的感觉。 Erlang 的问题是缺少范围,或者更准确地说,整个函数子句中只有一个范围。我们确实就是否引入范围进行了认真的讨论,但最终我们决定反对它,因为它与现有系统向后不兼容。并且开发人员讨厌向后不一致的更改。
Erlang 方法有一个重要的好处:当你出错时,你通常会得到一个错误,因此你可以看到错误。相比之下,当变量没有您期望它具有的值时会出现奇怪的行为,这非常更难检测和纠正。
我个人认为新变量名称的问题,例如使用数字方案,被夸大了。与我解决什么所花费的时间相比,我将要做的更改变量名称是微不足道的。过了一会儿,你只是看到它而不反思它。老实说。
编辑:
此外,当通过一系列函数链接数据时,数据的实际含义会发生变化,因此重用相同的变量名可能会产生很大的误导。它最终可能只是意味着一个通用的“我从一个函数传递到另一个函数的数据”。
【讨论】:
【讨论】:
因为它更简单。
看一下this question 2009 年发布到 Erlang 邮件列表的内容。具体来说这部分:
在大多数情况下,我喜欢模式匹配,但我发现我会写 足够的代码,我需要增量更新数据结构,以及 当我有这样的代码时,维护该代码是一件痛苦的事情:
X = foo(),
X1 = bar(X),
X2 = xyzzy(X1),
blah(X2).
以后想改成:
X = foo(),
X1 = whee(X),
X2 = bar(X1),
X3 = xyzzy(X2),
blah(X3).
编者注——这是对该问题的答复。
这经常通过 IRC。这是变量命名不佳的结果 实践,无需引入重新绑定来“修复”它; 停止使用单个字母和计数器作为变量名。
如果是这样写的
FooStateX = foo(),
PostBarX = bar(FooStateX),
OnceXyzziedX = xyzzy(PostBarX),
blah(OnceXyzziedX).
代码表明在 Erlang 中并不少见(注意“这经常通过 IRC”)。 Elixir 简单地重新绑定名称的能力使我们不必一直为事物生成新的虚拟名称。就这样。请记住,Erlang 的最初创建者并没有尝试构建函数式语言。他们只是有问题要解决的务实的开发人员。 Elixir 的方法是简单的实用主义。
【讨论】: