Можем ли мы получить ссылку, обозначенную переменной в SML? - PullRequest
0 голосов
/ 23 апреля 2020

в SML, учтите побочный эффект по ссылкам.

  • Верно ли, что любая переменная (независимо от того, используется ли она с побочным эффектом или без нее) обозначает ссылку, которая затем ссылается на значение?

  • Можно ли получить ссылку, обозначенную переменной? Есть ли такая же операция, как & в C? (В SML переменная как выражение по умолчанию оценивается не по ссылке, обозначенной переменной, а по значению, указанному ссылкой, обозначенной переменной.)

  • Может ссылка будет результатом вычисления выражения?

Спасибо.

1 Ответ

3 голосов
/ 23 апреля 2020

Ваш первый вопрос не совсем понятен. Не все значения в SML являются ref типами. В val a = 3 имя a связано с int, а не с int ref типом. Таким образом, в этом смысле ответ просто «нет», не все значения в SML являются ссылками, большинство из них - нет. С другой стороны, вопрос реализации немного затрагивает вопрос о том, использует ли реализация SML ссылки для управления привязками имен к значениям.

Для двух других ваших вопросов, для любого типа 'a в SML есть связанный тип ссылки 'a ref. Вы можете создавать значения этого типа и назначать их переменным. Имея значение типа ref, вы можете разыменовать его (используя оператор !), чтобы получить значение, на которое оно ссылается (в противном случае оно будет несколько бесполезным), и вы можете возвращать ссылочные типы из функций. Фактически функция ref является функцией полиморфизма c, которая возвращает ссылочные типы. См. sml - Использование функции ref .

SML не имеет оператора адреса, такого как & в C, но ссылочные типы могут быть использованы для ссылки на значение которым имя связано.

Учитывая

val a = 4
val b = ref(3)

b теперь является int ref. Это b может быть сделано для ссылки на значение, с которым a связан:

b := a

Теперь !b оценивается как 4. Таким образом, в этом смысле := аналогично = & в C, но это деталь реализации, если под капотом b было указано, что он указывает на то же место в памяти, в котором хранилось значение a или если значение было скопировано в место, куда уже указывал b.

...