Я думал о том, как бы я занялся проектированием «идеального» литерала диапазона, если бы я занимался дизайном языка. Для вас, кто не знает, вы знаете литерал диапазона в выражении, представляющем диапазон значений, например 1-4. Они чаще всего используются в циклах for / foreach
Кажется, есть пара вопросов, которые следует учитывать
Поддержка инклюзивных и эксклюзивных диапазонов, привязка к +1 или -1 к конечным точкам кажется немного ошибочной и подверженной ошибкам.
Поддержка степпинга, так что вы можете сделать диапазон четных или нечетных чисел, например
Читаемость, должно быть очевидно, что описывает диапазон
Однозначность, должно быть совершенно однозначно то, что описывает литерал диапазона
Значение по умолчанию должно быть от включающего к исключительному, поскольку именно это используется в большинстве случаев для циклического перебора массивов и т. Д.
В любом случае, одним из примеров литерала диапазона, который я видел, является Ruby, который имеет форму 1..3 для исключительного (в конце) диапазона и 1 ... 3 для включающего (в конце). Вы также можете сделать 1..10.step (5). После тщательного рассмотрения я обнаружил, однако, пару вещей, которые мне не нравились в этом подходе (из моего ограниченного знания рубина)
Вы можете описать только включительно и эксклюзивно для конца. При описании большинства сценариев это выглядит немного противоречивым.
Варьируется просто доп. Похоже, это рецепт, из-за которого трудно понять, является ли диапазон включительным или эксклюзивным. Я не знаю о вас, но точки имеют тенденцию становиться чем-то вроде размытия :)
Добавление метода, такого как нотация для диапазонов, кажется, смешивает понятие литерала с понятием класса, который кажется немного противоречивым (даже если диапазоны компилируются в класс)
В любом случае, после обдумывания разных альтернатив. Я придумал это
- [5..1] 5,4,3,2,1
- [1..5 [ 1,2,3,4
- ] 1..5] 2,3,4,5
- [ 0..5..20] 0,5,10,15,20
и так далее. Мне это нравится, потому что [обычно денонсирует набор, и это как бы вписывается в это, хотя это в отличие от набора будет упорядоченным.
Одна вещь, о которой я немного волнуюсь, - это сделать обязательными или нет обязательные или исключительные индикаторы, т.е. если вы пишете только 1..5, по умолчанию будет 1,2,3,4, так как это наиболее распространенный случай с массивами и т. Д. Это легче и более читабельно, но менее конкретно, и если вам пришлось писать [1..5 [вы рано узнаете о том, как они работают.
Так что вы думаете, я охватил большинство баз, что-то упустил? Вы бы сделали [] обязательным? Будете ли вы по-разному проектировать литералы диапазона на вашем языке программирования?
Кандидаты
- стиль скобок: [0..10 [ , с шагом: [0..5..20 [
- обозначение интервала: [0..10) с шагом: [0..5..20)
- Восклицательный для эксклюзивных. 0 ..! 10, с шагом: 0..5 ..! 20
- с другим шагом. 0 ..! 20, 5
- однако это сделало бы значение по умолчанию * 0..10 ' включительно включительно
- многословно: [от 0 до! 20 на 5]
Я должен сказать, что мой любимый эстетически до сих пор 0 ..! 10 и 0..5 ..! 20 , я просто хочу, чтобы по умолчанию 0..10 для включительно-эксклюзивного было бы более логичным
1,5,10,15,20
Разрыв 4, 5, 5, 5 ?!