Пытался придумать, как сделать variant для ББЦБ. Так случайно совпало, что предложили постажироваться на проекте с использованием Swift, и, в то же время, один знакомый стал изучать swift. Вот какой диалог стал между нами происходить:
И вот мой ответ (в ходе мозгового штурма по добавлению variant-ов):
D: Еще в Swift интересно сделаны указатели: UnsafePointer подобные структуры. В Swift вообще нет простых типов. Так даже обыкновенно встроенные типы вроде Integer, в Swift это структуры.
И самое интересное, что это правильно.
Например, в C# Integer это объект, и тут возникает вопрос - объект как копируется, по значению, по ссылке?
Т.е. сразу неоднозначность. В Swift сруктура это почти объект, но передается по значению,
наследования нет, но есть имплементация протоколов (интерфейсов).
Это правильно, это мне подходит.
Интересный вопрос, но я не думаю, что у него есть простой ответ. Смотри, что тут есть.
1. Иммутабельность. Integer иммутабелен, ты не можешь из двойки сделать 5-ку. Поэтому не так важно, как он передаётся. В лиспе написано, что компилятор имеет право копировать числа в любой момент, или передавать по ссылке.
2. Разные определения эквивалентности. Ты можешь сравнивать записи как минимум, двумя способами: можно сравнивать их адреса (т.е. проверять, то же это объект в памяти или нет). А можно сравнивать их содержимое. В этом смысле всё же важно, передаёшь ты объект по копии или по значению. Оба способа сравнения имеют свою область применения, и выкинуть какой-то из них нельзя. Если мы рассматриваем integer как настоящую запись, то в принципе и для integer получается два разных способа сравнения. В лиспе так и есть - там есть eq - оно сравнивает адреса объектов. У тебя может быть (not (eq 1 1)), если две единицы хранятся по разным адресам. А есть сравнение с учётом семантики чисел - eql. Всегда (eql 1 1).
Так что есть две неоднозначности - как копировать и как сравнивать. Обе неустранимы. Хорошо здесь то, что эти неоднозначности выглядят одинаково для чисел и для других иммутабельных записей. Т.е. действительно, можно построить числа в общий ряд и это решение хорошее.
Но вот как в swift-е ты можешь выразить передачу по ссылке? Я так понял, http://qaru.site/questions/2425788/pass ... e-in-swift с помощью copy-on-write. Ну что же, это жизнеспособно, хотя я бы не сказал, что мне это нравится. Для меня явное всегда предпочтительнее неявного. Но может быть, я просто что-то в жизни не понял :)