Как черновой вариант формализации...
andylars 31.05.2016 15:44
/ 31.05.2016 23:22
Для Парсера у меня уже давно есть свое определение/позиционирование в его защиту и как аргумент против всего остального: "Pocket-Rocket"-карманная ракета.
Обратная и позитивная сторона медали в том, что он все еще очень быстрый и шустрый, и в то же время дает довольно комфортные высокоуровневые абстракции, для написания веб-приложения определнного уровня. Под обычные сайт он более, чем overkiller, просто в последнее время сайты становятся все более "необычные".
Ближе к делу...
Черновая попытка формализации всего в пару методов add/delete для
hashи пара "бонусов" после, семантика "швах", но на правах наброска:
------------- hash.add ------------------------
^hash.add[newkey][value][options] # в выражениях метод возвращает true/false - результата выполнения
При данном наборе опций, закрывает пожалуй всё и даже больше, что крутится вокруг всех этих insert/update/rename/upsert/insert_before и так далее...
-
newkey: # ключ (новый ключ, см. options: preserve)
-
value: # значение
-
options: # 3.5 опции, дающие, пожалуй, исчерпывающие манипуляции с хешем
1 --
$.at[key | index) # если указан, то вставка на место key или index
2 --
$.place[ before | inpos(default) | after ] # если
$.at - не указан, то новый ключ (
newkey) добавляется в начало (before) или конец (after) хеша (как это обычно происходит), в таком случае inpos равносилен after.
Если
$.at - указан, то вставляет либо вместо старого ключа (inpos - по умолчанию), либо after/before указанного и найденного по
$.at - ключа.
3 --
$.preserve_inpos[ none | key | value ] # при ситуации обновления/замены ключа[значения], т.е. когда указан
$.at +
$.place[inpos], есть возможность заменить не всю пару: ключ-значение, а только ключ, или значение, т.е. сохранить в inpos - старое название ключа key, или старое значение value. По-умолчанию (none), который заменит, найденый по
$.at ключ-значение на newkey[value] (опция для наглядности, фактически при $at + place[inpos] - можно было бы опустить один из аргументов у add[newkey][value] что было бы равнозначным намерением, заменить только имя ключа или только значение.
4 --
$.strict_mode( true | false ) # строгий режим, для операций добавления/изменения:
если режим включен (true), то:
--- при добавлении нового ключа ($.at не указан), но если одноименный ключ (newkey), уже существует в хеше, то операций не производится (при ВЫключенном strict_mode, ключ бы просто перезаписался, как это делает обычное присвоение по одноименному ключу)
--- при замене сущ.ключа ($.at указан), но фактически по $.at такой ключ отсутствует, то так же, операций не производится (при ВЫключенном strict_mode, некорректный $.at просто бы проигнорировался и произошла операция добавление нового ключа.
------------- /hash.add ------------------------
------------- hash.delete, move ------------------------
^hash.delete [key|index) # удалить по индексу или названию ключа
^hash.move[key|index)[options] # переместить ключ,
- options: # по аналогии с add
$.at[key|index)
$.place[after|before)
по аналогии с add - переместить пару ключ-значение в начало или конец хеша,
или до/после указанного в $.at ключа
------------- /hash.delete, move ------------------------
------------- hash.order, cursor ------------------------
^hash.order[order] - изменить порядок следования ключей, тут не знаю, index_asc/desc, key_asc/desc
^hash.cursor[set|first|last|prev|next][key|index)[options] - курсор, как offset у table,
set устанавливает курсор на key/index, first, last, prev, next - смещает
options:
-
$.scroll[ void | sticky | cycle ] - правила скроллинга для next/prev при выходе смещения за пределы диапазона хеша,
-- void: отдавать пустое (void) значение (стоит по-умолчанию)
-- sticky: отдавать последнее возможное значение (при prev, это будет first, при next, это будет last)
-- cycle: скроллить курсор, возвращая смещение к первой позиции или наоборот
(курсор это уже так, для "коробочности" (фреймворкнутости), он базовым методом ^hash.at конечно и так реализуется на раз-два), а еще лучше докрутить до "паджинации" - листания пачками и возврата подхеша текущей/выбранной страницы.
------------- hash.order, cursor ------------------------
------------- addons for hash.at, foreach ------------------------
^hash.at[cursor] - доступ по курсору
^hash.foreach - хетелось бы без error flock (т.е. внутри тела перебора, можно удалить/изменить текущий ключ)
^hash.deepcopy[hash][options] - глубокое копирование
с разыменовыванием всех подвложенных хешей до нахождения скалярного значения,
без рекурсивного зацикливания на самого себя
------------- /addons for hash.at, foreach ------------------------
- Есть ли какой-то ловкий способ изменить имя ключа в hash, с сохранием его места (по индексу)., andylars 28.05.2016 12:28
- и всё, что-ли? даже в top3 самых больших тредов не добрались! %-) (-), Misha v.3 [M] 16.06.2016 10:15
- Ответ, moko [M] 16.06.2016 14:28
- Огласите top :) (-), andylars 16.06.2016 11:24
- Ответ, Misha v.3 [M] 16.06.2016 14:29 / 16.06.2016 14:30
- Ответ, moko [M] 30.05.2016 00:59
- Всмысле это предложение или уже недокументированная возможность в ночных сборках?, andylars 30.05.2016 11:04 / 30.05.2016 11:05
- Ответ, moko [M] 30.05.2016 12:38
- Методы для работы с порядком элементов в хеше..., Sumo [M] 06.06.2016 11:05 / 06.06.2016 11:06
- Ответ, G_Z [M] 06.06.2016 15:13
- Ответ, moko [M] 06.06.2016 13:48
- Можно вообще не делать новый метод вставки. а расширить add..., Sumo [M] 06.06.2016 14:03
- Ответ, Sumo [M] 06.06.2016 14:00
- Ответ, moko [M] 06.06.2016 14:29
- Ответ, moko [M] 06.06.2016 14:23
- Если «нестандартный вариант» кажется проблемой, то можно и иначе..., Sumo [M] 06.06.2016 15:09
- Ответ, moko [M] 06.06.2016 22:10
- От add - ожидаешь, что он сохранит физ.смысл = сложение/слияние ключей. Картинки прилагаются., andylars 07.06.2016 00:28 / 07.06.2016 00:50
- put это эффективный add одного элемента, moko [M] 07.06.2016 00:43
- Я однозначно не понимаю, как вы сочетаете add и before/after, andylars 07.06.2016 01:00
- Если перестать думать про ключи и значения, то все встает на вои места..., Sumo [M] 07.06.2016 06:29
- Я таки осознал, что надо наоборот - перестать думать об add, как overlapping-методе для множества, тем более, что он выбивается из стройного ряда. (-), andylars 08.06.2016 09:50
- Поэтому, дополнить операции со множествами - операциями с рядами, можно только органически подобными по механике, иначе imho каша., andylars 07.06.2016 10:33 / 07.06.2016 10:51
- Именно так я и воспринимал. Словарь - это множество. А массив - это ряд. И операции для них работают по-разному., andylars 07.06.2016 10:03
- Ответ, G_Z [M] 07.06.2016 02:01
- Ответ, G_Z [M] 06.06.2016 23:14
- Страшновато глазами пользователя... http://www.parser.ru/forum/?id=83206, andylars 06.06.2016 16:18 / 07.06.2016 00:37
- Мне так OK, moko [M] 06.06.2016 15:21
- Вопрос семантики: begin/end будут точнее first/last, но само поведение какое-то нелинейное получается. (-), andylars 06.06.2016 14:27
- Re: Ответ (updated), andylars 06.06.2016 12:08 / 06.06.2016 13:07
- Ответ, Sumo [M] 06.06.2016 13:14
- Как черновой вариант формализации..., andylars 31.05.2016 15:44 / 31.05.2016 23:22
- Ответ, moko [M] 01.06.2016 18:51
- Мудрёно, G_Z [M] 01.06.2016 00:16
- Ответ, andylars 01.06.2016 09:45 / 01.06.2016 09:47
- А еще получить индекс ключа, зная название ключа, как-то реально без перебора всех записей? (-), 28.05.2016 17:16