Есть ли язык, который позволяет манипулировать примитивами? - PullRequest
4 голосов
/ 15 июня 2011

В большинстве случаев языки не позволяют манипулировать ссылками на примитивы. Eg.:

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, будут возвращать значение вместо выполнения манипуляций с состоянием.

Мне было интересно, если бы не было языков, позволяющих примитивам манипулировать состоянием. Eg.:

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' для создания новых строк на каждой итерации.

Возможно, я схожу с ума от того, что даже удивляюсь этому, но с увеличением распространенности объектных моделей в качестве фона для переменных, кажется, что это может действительно существовать (это кажется безумно сложным в некоторых отношениях, особенно если вы допускаете 1020 * объект, которым манипулируют, но кажется, что такой синтаксис был бы хорошим источником изучения).

1 Ответ

4 голосов
/ 16 июня 2011

Вопреки тому, что вы, похоже, предполагаете, это не новая и не темная идея.Языки более низкого уровня не заботятся о том, чтобы обеспечить неизменность любого типа (в конце концов, ++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

В любом случае, никому просто не приходило в голову сделать примитивные типы неизменяемыми (почему они должны? В конце концов, машины фон Неймана все-таки об изменении состояния)указатели теряют большую часть своего значения, если вы не можете изменить указанное значение, и запрет указателей на определенные изменяемые типы будет бессмысленным и серьезным ограничением.

...