--- parser3/operators.ru.txt 2002/08/05 13:59:44 1.60 +++ parser3/operators.ru.txt 2002/10/15 09:42:40 1.88 @@ -5,15 +5,19 @@ Xне сделано, видимо, не будет сделано операторы !^eval(выражение)[формат] выражение, кроме обычных функций:: + !допустимы #комментарии + работают до конца строки или закрывающейся круглой скобки + внутри комментария допустимы вложенные круглые скобки !из неочевидных операторов: - # побитный xor - ## логический xor + !| побитный xor + !|| логический xor ~ побитное отрицание \ целочисленное деление 10\3=3 !def для проверки defined, пустая строка не defined пустая таблица не defined пустой hash не defined + ^if(method $hash.delete){yes} !eq ne lt gt le ge для сравнения строк, !in "/dir/" для проверки ["внутри не допустимы, если надо сравнить со сложным, @@ -27,16 +31,17 @@ Xне сделано, видимо, не будет сделано !числовой литерал бывает 0xABC !приоритеты: /* logical */ - %left "##" + %left "!||" %left "||" %left "&&" %left '<' '>' "<=" ">=" "lt" "gt" "le" "ge" %left "==" "!=" "eq" "ne" %left "is" "def" "in" "-f" "-d" %left '!' + условие ? когдаДа: когдаНет /* bitwise */ - %left '#' + %left '!|' %left '|' %left '&' %left '~' @@ -45,6 +50,8 @@ Xне сделано, видимо, не будет сделано %left '-' '+' %left '*' '/' '%' '\\' %left NEG /* negation: unary - */ + + !^if(условие){когда да}{когда нет} !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}} !^while(условие){тело} @@ -85,7 +92,8 @@ Xне сделано, видимо, не будет сделано default as-is !^taint[[lang]][код] default "just tainted, language unknown" - !^process{строка, которая будет process-ed, как код} + !^process[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код} + по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS] !^connect[protocol://строка соединения]]{код с ^sql[...]-ями} !mysql://user:pass@{host[:port]|[/unix/socket]}/database? charset=cp1251_koi8& @@ -160,8 +168,10 @@ odbc c:\drives\y\parser3project\odbc\ !и есть исключение: ^untaint[html]{код} не оптимизируется Xбезотностительно флажка - !у всех макросов есть локальная переменная $result, если в неё что положить, + !у всех методов есть локальная переменная $result, если в неё что положить, !то _это_ будет результатом макроса, а не его тело + !у всех методов есть локальная переменная $caller, в ней лежит родительский stack frame, + !если туда записать !use(^use или @USE) ищет файл... !1. ...если путь начинается с /, то считается, что это путь от корня веб пространства @@ -216,6 +226,10 @@ odbc c:\drives\y\parser3project\odbc\ !void + !^имя.length[] + 0 + !^имя.pos[...] + -1 !^имя.int[] (default) 0 или default !^имя.double[] (default) @@ -260,7 +274,13 @@ odbc c:\drives\y\parser3project\odbc\ !^строка.match[шаблон][опции поиска]{замена} опции поиска+= g заменить все вхождения, а не одно + !^строка.split[разделитель][[lrhv]] + l слева направо [default] + r справа налево + h nameless таблица + v таблица из столбца piece [default] !^строка.{l|r}split[разделитель] таблица из столбца $piece + оставлен для совместимости !^строка.upper|lower[] X^строка.truncate(предел терпенья) стиль :( !^строка.length[] @@ -281,8 +301,8 @@ odbc c:\drives\y\parser3project\odbc\ логическое значение равно "не пуста?" числовое значение равно count[] !^table::create[[nameless]]{данные} старое имя "set" - !^table::create[table] - клонирует таблицу + !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur]]] + клонирует таблицу !^table::load[[nameless;]путь] !если не nameless, названия колонок берутся из первой строки !пустые строки, и строки в первой колонке содержащие '#', игнорируются @@ -303,18 +323,18 @@ odbc c:\drives\y\parser3project\odbc\ X^таблица.remove(position[;count]) - стирает запись из текущей позиции [стирает запись из конкретной позиции] [стирает count записей] - !^таблица.join[таблица] - добавляет записи из таблицы. + !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. таблицы должны иметь одинаковую структуру. !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать !^таблица.locate[поле;значение] передвигает текущую строку, если найдёт. выдаёт bool !^таблица.locate(логическое выражение) передвигает текущую строку, если найдёт. выдаёт bool - !^таблица.hash[поле, что будет ключом][[поле значений|table поля значений]]+ + !^таблица.hash[поле, что будет ключом][[поле значений|table поля значений]][[$.distinct(1)]] значением $hash.ключ будет hash в котором поля значений будут ключами поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой !^таблица.columns[]+ таблица из одного столбца $column !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало - $adults[^man.select($man.age>=18)] - ^таблица.color[цвет1;цвет2] + $adults[^man.select($man.age>=18)] + ^таблица.color[цвет1;цвет2] !hash @@ -334,7 +354,7 @@ odbc c:\drives\y\parser3project\odbc\ !^a.intersection[b] = пересечение значения a !^a.intersects[b] = bool - !^hash::sql{запрос}[[$.limit(2) $.offset(4) todo:$.default{$.field[]...}]] + !^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]] получается hash(ключи=значения первая колонка ответа) of hash(ключи=названия остальных колонкок ответа) !^hash._keys[]+ таблица из одного столбца $key @@ -358,6 +378,7 @@ odbc c:\drives\y\parser3project\odbc\ !request !$request:query + !$request:body unprocessed POST request body !$request:uri X!$request:browser это hash, поля: !$type = ie/nn и !$version = номер, скажем 5.5 @@ -374,6 +395,8 @@ odbc c:\drives\y\parser3project\odbc\ !значение может быть string а может быть hash: ! $value[abc] field: {abc}<<часть ! $attribute[zzz] field: abc; {attribute=zzz}<<часть + !значение поля или атрибута может быть string или date + ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT" !$response:body[DATA] замещает стандартный ответ !$response:status !^response:clear[] забыть все заданные response поля @@ -630,6 +653,8 @@ math количество дней с epoch [1 января 1970 (UTC)], дробное !всё происходит в localtime, !временная зона задаётся вне parser средствами OS + $date:UTC-offset сколько дней надо прибавить,чтобы попасть в local время + $date:TZ наш часовой пояс, дробное, в часах (где-то есть с точностью до получаса) !^date::now[] !^date::now(смещение в днях) выдаёт сейчас+смещение !^date::create(дней с epoch) // старое имя set @@ -638,14 +663,13 @@ math для удобного создания по значению из базы формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]] формат2: %H:%M[:%S] - !$date.year month day hour minute second weekday todo:yearday + !$date.year month day hour minute second weekday yearday(0...) daylightsaving read-only !^date.roll[year|month|day](+-смещение) сдвигает дату - возможно, флажок, подправляющий день !^date.sql-string[] %Y-%m-%d %H:%M:%S where published='$дата.sql-string[]' !^date:calendar[rus|eng;год;месяц] выдаёт неименованную таблицу - столбцы: 0..6, week + столбцы: 0..6, week, weekyear !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу столбцы: year, month, day, weekday @@ -813,7 +837,7 @@ xdoc(xnode) does not support data NO_MODIFICATION_ALLOWED_ERR If an attempt is made to modify an - object where modifications are not + object where modifications are not allowed NOT_FOUND_ERR If an attempt was made to reference a @@ -863,6 +887,11 @@ xdoc(xnode) !ixrss integral shared text memory size !idrss integral unshared data size !isrss integral unshared stack size + !tv_sec + !tv_usec + $s[$status:rusage] + ^s.tv_sec.format[%.0f].^s.tv_usec.format[%06.0f] + !DATA::=string | file @@ -913,8 +942,9 @@ xdoc(xnode) !xml ^xdoc::create{} any error in xml/xslt libs !smtp.connect not found/timeout !smtp.execute communication error - - + !email.format hren tam@null.ru wrong email format(bad chars/empty) + !email.send $MAIL.sendmail[/shit] sendmail not executable + !нужно выключить русский apache: CharsetDisable on !если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет