2011-06-15 54 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

相關問題