[ksi] Синтаксис диапазонов -- тип range
От: Sm0ke Россия ksi
Дата: 30.01.22 21:34
Оценка:
Разрабатываю свой язык, потому что хочу и свободное время позволяет. Добрый день.

Помогите пожалуйста подобрать конструкцию для диапазонов значений. Диапазон может быть как открытый, так и закрытый, и с обоих концов. Дополнительно он хранит шаг, который по_умолчанию равен 1. Если нижняя граница не указана, то она равна 0.

Пока остановился на таком варианте:
-- нижняя граница включена
[: 8]               -- [0 .. 8) step 1
[: 8 : 2]           -- [0 .. 8) step 2
[: 4 .. 8]          -- [4 .. 8) step 1
[: 4 .. 8 : 2]      -- [4 .. 8) step 2
[: 8 =]             -- [0 .. 8] step 1
[: 8 =: 2]          -- [0 .. 8] step 2
[: 4 .. 8 =]        -- [4 .. 8] step 1
[: 4 .. 8 =: 2]     -- [4 .. 8] step 2

-- нижняя граница открыта
[:: 8]              -- (0 .. 8) step 1
[:: 8 : 2]          -- (0 .. 8) step 2
[:: 4 .. 8]         -- (4 .. 8) step 1
[:: 4 .. 8 : 2]     -- (4 .. 8) step 2
[:: 8 =]            -- (0 .. 8] step 1
[:: 8 =: 2]         -- (0 .. 8] step 2
[:: 4 .. 8 =]       -- (4 .. 8] step 1
[:: 4 .. 8 =: 2]    -- (4 .. 8] step 2

* Однострочный комментарий начинается с последовательности минус минус --

Использовать просто [1 .. 2] не могу, т:к просто квадратные скобочки будут использованы для массивов.

Вот ещё вариант:
Но тут подсветка парных скобок в текстовых редакторах не всегда сможет работать правильно.
[: 8)               -- [0 .. 8) step 1
[: 8 : 2)           -- [0 .. 8) step 2
[: 4 .. 8)          -- [4 .. 8) step 1
[: 4 .. 8 : 2)      -- [4 .. 8) step 2
[: 8]               -- [0 .. 8] step 1
[: 8 : 2]           -- [0 .. 8] step 2
[: 4 .. 8]          -- [4 .. 8] step 1
[: 4 .. 8 : 2]      -- [4 .. 8] step 2

(: 8)               -- (0 .. 8) step 1
(: 8 : 2)           -- (0 .. 8) step 2
(: 4 .. 8)          -- (4 .. 8) step 1
(: 4 .. 8 : 2)      -- (4 .. 8) step 2
(: 8]               -- (0 .. 8] step 1
(: 8 : 2]           -- (0 .. 8] step 2
(: 4 .. 8]          -- (4 .. 8] step 1
(: 4 .. 8 : 2]      -- (4 .. 8] step 2


С удовольствием рассмотрю ваши варианты.
Отредактировано 30.01.2022 21:38 Sm0ke . Предыдущая версия . Еще …
Отредактировано 30.01.2022 21:37 Sm0ke . Предыдущая версия .
range ksi
Re: [ksi] Синтаксис диапазонов -- тип range
От: T4r4sB Россия  
Дата: 30.01.22 21:44
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Использовать просто [1 .. 2] не могу, т:к просто квадратные скобочки будут использованы для массивов.


Посмотри, как сделано в Го или Расте
1 .. 2 для полуоткрытого, 1 ..= 2 для закрытого
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: [ksi] Синтаксис диапазонов -- тип range
От: Sm0ke Россия ksi
Дата: 31.01.22 01:31
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Посмотри, как сделано в Го или Расте

TB>1 .. 2 для полуоткрытого, 1 ..= 2 для закрытого

Посмотрел.

В расте нет возможности использовать открытую нижнюю границу. И нет шага.
Кроме того только целые числа, как я понял. Я хочу сделать чтобы флоаты можно было тоже использовать.

В го не нашёл диапазоны. Только есть слайсы, и они вроде всегда с закрытым верхним пределом.
s := myset[0:4]

Не понравилась документация у обоих языков (у го даже нет поиска). Как же всё хорошо задокументировано у php, в отличии от них.
Отредактировано 31.01.2022 1:49 Sm0ke . Предыдущая версия .
Re: [ksi] range -- вариант ближе к расту короче
От: Sm0ke Россия ksi
Дата: 31.01.22 01:43
Оценка:
Если всегда указывать нижнюю границу, то можно отказаться от внешних скобочек. Получается почти как у раста.

Вариант 1:
0 .. 8              -- [0 .. 8) step 1
0 .. 8 : 2          -- [0 .. 8) step 2
0 ..= 8             -- [0 .. 8] step 1
0 ..= 8 : 2         -- [0 .. 8] step 2

0 >.. 8             -- (0 .. 8) step 1
0 >.. 8 : 2         -- (0 .. 8) step 2
0 >..= 8            -- (0 .. 8] step 1
0 >..= 8 : 2        -- (0 .. 8] step 2

* Редко бывает нужен открытый нижний, но меня напрягает эта стрела >..=
Может заменить знак ">" ?

Вариант 2:
0 =..  8            -- [0 .. 8) step 1
0 =..  8 : 2        -- [0 .. 8) step 2
0 =..= 8            -- [0 .. 8] step 1
0 =..= 8 : 2        -- [0 .. 8] step 2

0 ..  8             -- (0 .. 8) step 1
0 ..  8 : 2         -- (0 .. 8) step 2
0 ..= 8             -- (0 .. 8] step 1
0 ..= 8 : 2         -- (0 .. 8] step 2

* Правда тут теряется user experience у программистов на расте, что не очень хорошо.

Возможно ещё проще?
Отредактировано 31.01.2022 1:46 Sm0ke . Предыдущая версия .
Re: [ksi] Синтаксис диапазонов -- тип range
От: night beast СССР  
Дата: 31.01.22 06:09
Оценка: 6 (1)
Здравствуйте, Sm0ke, Вы писали:

S>Помогите пожалуйста подобрать конструкцию для диапазонов значений. Диапазон может быть как открытый, так и закрытый, и с обоих концов. Дополнительно он хранит шаг, который по_умолчанию равен 1. Если нижняя граница не указана, то она равна 0.


S>С удовольствием рассмотрю ваши варианты.


я бы остановился на варианте питона [a:b:s] -> [a .. b)
куча различных вариантов не всегда плюс.
Re[2]: [ksi] Синтаксис диапазонов -- тип range
От: Ватакуси Россия  
Дата: 01.02.22 13:30
Оценка:
NB>я бы остановился на варианте питона [a:b:s] -> [a .. b)
NB>куча различных вариантов не всегда плюс.

+ pandas.Dataframe или numpy.ndarray операторы
Все будет Украина!
Re: [ksi] Синтаксис диапазонов -- тип range
От: wildwind Россия  
Дата: 01.02.22 14:50
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Диапазон может быть как открытый, так и закрытый, и с обоих концов. Дополнительно он хранит шаг, который по_умолчанию равен 1.


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

S>Если нижняя граница не указана, то она равна 0.


А почему именно 0, а не -∞, например?

S>С удовольствием рассмотрю ваши варианты.


А если так: Range(8-, 2+)? "+" означает закрытый, "-" открытый.
Еcли хочется покороче, можно типа _R(8-, 2+)
Re[2]: [ksi] Синтаксис диапазонов -- тип range
От: Sm0ke Россия ksi
Дата: 01.02.22 17:35
Оценка:
Здравствуйте, wildwind, Вы писали:


W>А зачем тут шаг?


Чтобы сразу указать его и итерировать в цикле. Или можно взять слайс от массива, тоже с шагом.

Я думал над тем, чтобы шаг не хранить, если он не указан, но решил, что лучше всегда хранить, чтобы можно было потом в программе его проверять без лишних костылей типа проверки наличия поля.

S>>Если нижняя граница не указана, то она равна 0.


W>А почему именно 0, а не -∞, например?


Можно явно указать и минус бесконечность, но итерировать тогда нельзя будет. Какой тогда прок использовать минус бесконечность по умолчанию?
Ещё я думаю, что можно будет явно указать значение null (не задано).

S>>С удовольствием рассмотрю ваши варианты.


W>А если так: Range(8-, 2+)? "+" означает закрытый, "-" открытый.

W>Еcли хочется покороче, можно типа _R(8-, 2+)

_R — это врядли.

Тогда как-то так?
`range(4+, 8-)
`range(4+, 8+)
`range(4-, 8-)
`range(4-, 8+)

* Ключевые слова в ksi с бактика скорее всего будут. Но возможно что с подчёркивания.

Теперь сравним
   ваш вариант    rust+       питон

_range(4+, 8-)    4 .. 8      [4:8]
_range(4+, 8+)    4 ..= 8
_range(4-, 8-)    4 *.. 8
_range(4-, 8+)    4 *..= 8


И с шагом
   ваш вариант+      rust+           питон

_range(4+, 8-, 2)    4 .. 8 : 2      [4:8:2]
_range(4+, 8+, 2)    4 ..= 8 : 2
_range(4-, 8-, 2)    4 *.. 8 : 2
_range(4-, 8+, 2)    4 *..= 8 : 2


И наконец в слайсах
             ваш вариант     rust+                   питон

array[`range(4+, 8-, 2)]     array[4 .. 8 : 2]       array[4:8:2]
array[`range(4+, 8+, 2)]     array[4 ..= 8 : 2]
array[`range(4-, 8-, 2)]     array[4 *.. 8 : 2]
array[`range(4-, 8+, 2)]     array[4 *..= 8 : 2]


В общем пока думаю)
Отредактировано 01.02.2022 17:41 Sm0ke . Предыдущая версия .
Re[3]: [ksi] Синтаксис диапазонов -- тип range
От: wildwind Россия  
Дата: 02.02.22 07:50
Оценка:
Здравствуйте, Sm0ke, Вы писали:

W>>А зачем тут шаг?

S>Чтобы сразу указать его и итерировать в цикле. Или можно взять слайс от массива, тоже с шагом.

Так это атрибут цикла или слайса, а не диапазона как такового.

S>Можно явно указать и минус бесконечность, но итерировать тогда нельзя будет.


Отчего же нельзя? В сторону бесконечности — можно.
Кроме того, диапазоны не только для итерирования используются.
Отредактировано 02.02.2022 7:53 wildwind . Предыдущая версия .
Re[4]: [ksi] Синтаксис диапазонов -- тип range
От: Sm0ke Россия ksi
Дата: 02.02.22 13:55
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, Sm0ke, Вы писали:


W>>>А зачем тут шаг?

S>>Чтобы сразу указать его и итерировать в цикле. Или можно взять слайс от массива, тоже с шагом.

W>Так это атрибут цикла или слайса, а не диапазона как такового.


Поинт в том, что диапазон можно присвоить переменной и подставить потом её для слайса, или в качестве параметра цикла.
Просто не хочу делать два вида диапазона: с шагом и без.

S>>Можно явно указать и минус бесконечность, но итерировать тогда нельзя будет.


W>Отчего же нельзя? В сторону бесконечности — можно.


Начальная граница должна быть конечна. Последняя — любая.

W>Кроме того, диапазоны не только для итерирования используются.


Для чего ещё?
Конечно можно с помощью функции проверить лежит ли число в этом диапазоне и шаг тут не нужен.

Если всёже заводить два рэнджа и с шагом и без. Потом туда-сюда его конвертировать придётся.
$range ( from = 0, to )
$range_step : $range ( step )

r0 = $range{%to:10} -- [0, 10)
r2 = $range_step[4 8 2] -- [4, 8) step 2
r1 = r2.$range #clone # -- берём базовый класс который без шага
r3 = $range_step{$range:r1 %step:1} -- тут не надо писать (r1 #clone #) оно само

#contains $range* range value ( ret = /* вычисления */ ) -- функция contains перегружена для типа range и его потомков, т.е. может принимать и range_step

r2 #contains 5 #write_ln # -- true

* В этом примере открытость/закрытость границ не хранится. Т.е: [from, to)
** минус мину -- line comment
Отредактировано 02.02.2022 13:58 Sm0ke . Предыдущая версия .
Re[3]: [ksi] Синтаксис диапазонов -- тип range
От: Sm0ke Россия ksi
Дата: 09.02.22 03:35
Оценка:
Здравствуйте, Ватакуси, Вы писали:

NB>>я бы остановился на варианте питона [a:b:s] -> [a .. b)

NB>>куча различных вариантов не всегда плюс.

В>+ pandas.Dataframe или numpy.ndarray операторы


Не понял, поясните.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.