2011-06-15 79 views
4

在大多数情况下,语言不允许操作对基元的引用。例如:有没有一种语言可以操纵原语?

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'周期被声称是创建新的字符串每次迭代。

也许我为即使是想知道这一点而疯了,但随着对象模型作为变量背景的流行程度的增加,看起来这可能实际上存在(它似乎在某些方面非常复杂,特别是如果您允许被操纵的对象,但它看起来像这样的语法将是一个很好的学习来源)。

+0

有趣的是,由于意外的(对我来说)结构共享,Python确实让我感到紧张 - 但我一直试图压制细节,所以你必须寻找自己。 – LHMathies 2011-06-15 16:46:33

+0

@LHMathies其实,这是对Python的研究,让我想到了这一点。 “int”代表一个chached对象使得这个语言能够工作,但是如果'int'和其他所有东西一样呢? – cwallenpoole 2011-06-15 17:06:21

+1

'int'(和'string','tuple'等等)**就像**在这方面的其他所有内容。无论类型如何,Python总是使用对所有内容的引用。恰巧一些对象是不可变的。你可以(通过一些努力和丑陋)自己编写基本上不可变的类,并且在相同抽象级别(以及基本)实现的几个类是可变的。实际上,Python不是用来作为对“基元”和“非基元”进行不同处理的例子的语言。 – delnan 2011-06-15 20:12:00

回答

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 

在这两种情况下,它根本没有发生任何使原始类型不变(他们为什么要冯·诺依曼机是所有关于改变状态,毕竟),指针损失多少?如果你不能改变指向的值,并且不允许指向某些可变类型的指针将是无意义和严格的限制。

+0

迷人。把我所有的时间花在VHLL上的不利之处在于,这些事情看起来如此......并不明显。感谢你的回答 – cwallenpoole 2011-06-15 20:39:19

+1

一旦你看起来很明显,你应该在Haskell(或ML)中弄清楚为什么这种类型的操作实际上会让生活变得更加复杂。 C和朋友试图抽象机器如何工作,而功能性语言试图抽象计算如何发生。了解这两种方法会让你更好。 – 2011-06-18 05:41:00

+0

你知道,多花一点时间思考这个问题,我简直不敢相信它真的有多明显。我肯定会考虑Haskell,我一直都有这个意思,只是没有得到它。 – cwallenpoole 2011-06-22 14:29:06

相关问题