1) Оператор return — как он должен называться в русскоязычном языке?
- вернуть? — не очень хорошо, если результата нет (процедура, а не функция)
- возврат?
- другое?
2) Преобразование типа и динамическая проверка типа
Я не хочу делать две разных конструкции, как это сделано в Go, где есть
- конверсия (conversion): int64(x),
- и динамическая проверка типа (type assertion): x.(T).
Если один синтаксис, то надо сделать возможным использовать эту обобщенную конверсию на уровне PrimaryExpr или, как это называлось в Модуле/Обероне — designator. Я перебрал множество вариантов и остановился на вот таких скобках: ‹ › (U+2039, U+203A), то есть
- х‹цел64› — конверсия
- х‹Узел› — динамическая проверка типа, а по сути конверсия к типу Узел
Тогда эти скобки останутся для обобщенных типов: « ».
3) Null safety
Я решил, что надо делать с самого начала, так как если добавлять потом, придется исправлять уже написанный текст .
Долго маялся способом записи и тем, как лучше читается:
- сначала тип, потом признак nullable — как в Kotlin/Swift: T? (постфиксная запись)
- или наоборот, сначала признак, потом тип (префиксная запись).
Это существенно для составных типов, например, для массивов, если использовать постфиксную запись: []цел64? — к чему относится признак — к массиву или к элементу массива?
Решил, что префиксная лучше читается и придумал такую запись:
- мб Тип — где мб сокращение от «может быть».
Тогда для массивов:
- мб []Узел — массив может быть не задан (равен null в тех терминах), а элемент не может
- []мб Узел — массив всегда задан, а элемент может быть не задан.
- мб []мб Узел — и массив и элемент могут быть не заданы.
Вроде неплохо, а дальше практика покажет.
А для выражений надо добавить операторы ‘?’ и ‘!’, такие же как в Kotlin/Swift .
4) Идентификатор
Расписал идентификатор с пробелами, ‘-‘, ‘№’ и вопросительным, восклицательным знаком в конце. Примеры:
- Паниковать!
- Делится на три?
- проверка-массива
- пока № > 0 { №— }
5) Добавил в лексику «модификатор», то что обычно называется annotation или decorator. Нужно, для того, чтобы отметить заголовок «внешней» функции и «пред-описанной» функции — нужно, так как первый компилятор хочу сделать однопроходным.
Собственно, практически все. Можно писать компилятор.
Моя оценка разработки компилятора — две рабочие недели, 80 часов. Понятно, что из-за того, что работа будет с перерывами, то займет больше и растянется на несколько месяцев.
Постоянная ссылка
По пункту 1 — вариант «выход».
Постоянная ссылка
«выход» — это скорее break (или exit в виртовских языках). В идеале надо найти согласованную пару — return/break. Согласованную, в смысле — оба глагола или оба существительные.
Я использую сейчас вернуть/прервать.
Постоянная ссылка
break — это «прервать».
exit — это «выход».
А оставить надо «вернуть». Вернуть не только результат, но и управление в том числе. В любом случае, даже если «вернуть» — «что-то вернуть», но ничего не возвращается. фактически в терминах Си возвращается return void.