2017-02-04 16 views
0

Я работаю над созданием постепенно типизированного языка как личного проекта, и я застрял в определенном дизайнерском решении относительно неизменности.Неизменяемость: свойство переменной, значение или API?

Говоря об этом в языке агностик (и, вероятно, грубый), я говорю, что есть две вещи, которые могут быть неизменными или постоянными: привязка переменных и само значение.

Постоянная привязки переменных является как const в Javascript или final в Java, где переменная не может быть переназначена. Значение, являющееся неизменным, равно const в C++ или Object.freeze() в Javascript.

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

Значение/объект в Javascript's Object.freeze?

var point = {x: 10}; 
var frozenPoint = Object.freeze(point); 

или его часть, как на C++?

const Point p(10); 

или как переменное связывание, как в случае ржавчины?

let p = Point { x: 10 }; 
// vs let mut p = Point { x: 10 }; 

или как часть API библиотеки? Facebook Immutable.js, библиотека Google Guava для Java (ImmutableList класс) и т. Д.

Я понимаю, что для этого, вероятно, нет «правильного» ответа, так что я действительно ищу, это сравнение философий и мотивов для этих подходов.

ответ

1

Существует правильный ответ, но он сильно отличается от ожидаемого.

Лучше всего не иметь изменчивости вообще. Другими словами: язык должен быть чисто функциональным. Нет причин иметь изменчивость на языке с сборкой мусора. Haskell является доказательством этого.

+0

Я понимаю эту точку зрения, но я не могу согласиться с тем, что это «правильный ответ». Несомненно, это субъективное мнение, что чистая неизменность - это «лучший» способ сделать что-то. Целевая аудитория, которую я представляю, вероятно, предпочла бы способ управлять изменчивостью, и поэтому я ищу способ обеспечить это управление элегантно и «правильно». –

+0

Современные чисто функциональные языки дают возможность иметь мутации, а также очень элегантные и без ошибок способы управления ими. Это делается только на более высоком уровне, чем семантика основного языка. Поэтому высказывание «Haskell - лучший императивный язык». – libeako

+0

Я понимаю мнение аудитории, но я не согласен с ней. Вместо того, чтобы дать настоятельной аудитории еще один язык, их следует поощрять переходить к чисто функциональному программированию. – libeako