Ваш первый вопрос не совсем понятен. Не все значения в 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
.