Pull to refresh

SCLOG: велосипед со всеми признаками языка программирования

Reading time 2 min
Views 1.1K
Когда мы добрались до разработки системы пользовательских фильтров (или условий), Миша, наш главный по интерфейсам, завис. Он задумчиво смотрел в окно и курил одну за другой, иногда срывался и начинал молотить по груше, крича что-то нецензурное. Вообще, задача у него была непростая: на последнем совещание было решено, что заставлять пользователей создавать правила в текстовом виде – негуманно и неинтуитивно.

На третий день такого времяпрепровождения, Миша (oporkov) воскликнул: «У нас будет дерево!». Решение оказалось довольно простым: отображать условие в виде дерева, ветви которого обозначают логическое «и» или «или», а листья – операции сравнения. Несколько дней он смотрел в монитор, молотил по клавиатуре и бурчал что-то нецензурное. Однажды он спросил меня, как мы будем хранить дерево, учитывая, что я был поглащен оптимизацией SQL-запросов, ляпнул первое, что пришло в голову: «В строке».

В итоге я рассматривал следующее:
&( s_!=~( city , " Санкт- " ) , s_=( platform , " Linux " ) , i_>( screenw , 1024 ) , i_>( screenh , 800 ) , |( i_>( viewed , 7 ) , i_>=( timeonsite , 30 ) ) )

Что соответствовало такому дереву:


Пока я смотрел на эту строку и её сестер, во мне крепло мнение, что всё это похоже на язык программирования. В конце концов, после нескольких экспериментов, стало понятно, что проще всего сделать интерпретатор этого языка, а не вписывать его в другую логику. Рабочим названием стало «scisp», из-за обилия скобок. Но немного подумав, решили что оно не очень подходит, т.к. работа ведется больше с логикой, а не списками. В итоге язык обрел свое финальное название «SCLOG».

На текущий момент SCLOG поддерживает два типа данных («строка» и «целое»), два логических оператора («и» и «или»), четыре операции сравнения для строк («равно», «не равно», «содержит», «не содержит»), шесть операций для целых («равно», «не равно», «больше», «меньше», «больше или равно», «меньше или равно»), имеет визуальный инструмент строительства деревьев, написанный на jQuery, и интерпретатор на php.

Строка, которая была представлена выше, теперь должна выглядеть так:
&( !~(city,"Санкт-"),=(platform ,"Linux"),>(screenw,1024),>(screenh,800),|(>(viewed,7),>=(timeonsite,30)))

Исчезли незначимые пробелы, а операции сравнения обрели удобоваримое представление. Дерево же эволюционировало в нижеследующую форму (почти полностью модифицируемую CSS):


Что будет дальше:
  • новые типы данных: логические, дата-время, дробные и массивы;
  • интерпретатор на C#.


Где посмотреть:


P.S. Попросили добавить жизненных примеров, расскажу, зачем нам это нужно:
Пользователь задает какое-то правило; основная битва шла как раз за то, чтобы правила (они же фильтры) создавались более понятным способом, чем например в Outlook. Деревья, на наш взгляд, имеют более наглядный вид чем список строк. Дальше построенное дерево, сохраняется в виде строки на языке SCLOG. Потом, в момент обработки фильтров, эта строка интерпретируется на серверной стороне и возращает значение TRUE или FALSE.
Tags:
Hubs:
+13
Comments 39
Comments Comments 39

Articles