有没有一种语言可以操纵原语?

时间:2011-06-15 16:43:22

标签: language-design

在大多数情况下,语言不允许操纵对基元的引用。例如:

var a = 0;
var b = a; // value is copied
b++; // b now represents a new value as this is really b = b + 1; so a != b

虽然操纵非基元将导致(有时是破坏性的)状态操作,这反映在所有变量中(使用JS):

var a = [];
var b = a; // b is now a reference to the value stored in a.
a.push(1); // b[0] is now 1 -- b and a are pointing to the same thing.

这很有道理。我完全可以理解为什么像String.replace这样的东西会返回一个值而不是执行一个状态操作。

但是,我想知道,如果没有任何语言允许原语进行状态操作。例如:

var a = 0;
var b = a; // b references a
b++; // b and a are now = 1.

我知道更低级语言中的指针,这几乎就是我所说的,但我觉得它只是重新分配值而不是实际更新引用。

我也知道PHP引用,但因为PHP不允许这样的事情:

$str = "abcd";
$st[0] = "q"; // this causes an error.

此外,当在PHP中连接多个字符串时,$str .= 'var'的循环声称每次迭代都会创建新的字符串。

也许我甚至为此感到疯狂,但随着对象模型作为变量背景的流行程度的增加,似乎这可能确实存在(在某些方面似乎非常复杂,特别是如果你允许{ {1}}对象被操纵,但似乎这样的语法将是一个很好的学习来源。)

1 个答案:

答案 0 :(得分:4)

与您的假设相反,这既不是一个新想法,也不是一个模糊的。低级语言不打算强制执行任何类型的不可变性(毕竟,++i不存在或浪费其他 - 而且硬件也没有常量寄存器,对吧?),但他们也会更喜欢值类型(即a = b复制值,而不是默默地给出对相同值的引用),所以你必须弄清楚并告诉它两次引用相同的值,例如通过使用指针。在C:

int x = 0;
int *p = &x;
*p = 1;
/* x == 1 */

类似地,C ++具有同样强大的指针和引用,出于这些目的,它们的工作方式类似于隐式解除引用的指针(并且无法更改为指向其他任何内容,并且不能为NULL):

int x = 0;
int &y = x;
y = 1;
// x == 1

在任何一种情况下,任何人都不会发现原始类型是不可变的(为什么它们呢?冯诺依曼机器毕竟都是关于改变状态),如果你不能,指针会失去它们的大部分价值改变指向的值,禁止指向某些可变类型的指针将是一个毫无意义和严重的限制。