parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Как черновой вариант формализации...

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 ------------------------