Diff for /parser3/operators.ru.txt between versions 1.75 and 1.112

version 1.75, 2002/08/19 12:56:08 version 1.112, 2003/04/15 07:17:42
Line 5  Xне сделано, видимо, не будет сделано Line 5  Xне сделано, видимо, не будет сделано
   
 операторы  операторы
     !^eval(выражение)[формат] выражение, кроме обычных функций::      !^eval(выражение)[формат] выражение, кроме обычных функций::
           !допустимы #комментарии
               работают до конца строки или закрывающейся круглой скобки
               внутри комментария допустимы вложенные круглые скобки
         !из неочевидных операторов:          !из неочевидных операторов:
             # побитный xor              !| побитный xor
             ## логический xor              !|| логический xor
             ~ побитное отрицание              ~ побитное отрицание
             \ целочисленное деление 10\3=3              \ целочисленное деление 10\3=3
         !def для проверки defined,          !def для проверки defined,
             пустая строка не defined              пустая строка не defined
             пустая таблица не defined              пустая таблица не defined
             пустой hash не defined              пустой hash не defined
           ^if(method $hash.delete){yes}
         !eq ne lt gt le ge для сравнения строк,           !eq ne lt gt le ge для сравнения строк, 
         !in "/dir/" для проверки          !in "/dir/" для проверки
             ["внутри не допустимы, если надо сравнить со сложным,               ["внутри не допустимы, если надо сравнить со сложным, 
Line 27  Xне сделано, видимо, не будет сделано Line 31  Xне сделано, видимо, не будет сделано
         !числовой литерал бывает 0xABC          !числовой литерал бывает 0xABC
         !приоритеты:          !приоритеты:
            /* logical */             /* logical */
            %left "##"             %left "!||"
            %left "||"             %left "||"
            %left "&&"             %left "&&"
            %left '<' '>' "<=" ">="   "lt" "gt" "le" "ge"             %left '<' '>' "<=" ">="   "lt" "gt" "le" "ge"
            %left "==" "!="  "eq" "ne"             %left "==" "!="  "eq" "ne"
            %left "is" "def" "in" "-f" "-d"             %left "is" "def" "in" "-f" "-d"
            %left '!'             %left '!'
              условие ? когдаДа: когдаНет
   
            /* bitwise */             /* bitwise */
            %left '#'             %left '!|'
            %left '|'             %left '|'
            %left '&'              %left '&' 
            %left '~'             %left '~'
Line 45  Xне сделано, видимо, не будет сделано Line 50  Xне сделано, видимо, не будет сделано
            %left '-' '+'             %left '-' '+'
            %left '*' '/' '%' '\\'             %left '*' '/' '%' '\\'
            %left NEG     /* negation: unary - */             %left NEG     /* negation: unary - */
   
              
     !^if(условие){когда да}{когда нет}      !^if(условие){когда да}{когда нет}
     !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}      !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}
     !^while(условие){тело}      !^while(условие){тело}
Line 85  Xне сделано, видимо, не будет сделано Line 92  Xне сделано, видимо, не будет сделано
         default as-is          default as-is
     !^taint[[lang]][код]      !^taint[[lang]][код]
         default "just tainted, language unknown"          default "just tainted, language unknown"
     !^process{строка, которая будет process-ed, как код}      !^process[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код}
         по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS]
     !^connect[protocol://строка соединения]]{код с ^sql[...]-ями}      !^connect[protocol://строка соединения]]{код с ^sql[...]-ями}
         !mysql://user:pass@{host[:port]|[/unix/socket]}/database?          !mysql://user:pass@{host[:port]|[/unix/socket]}/database?
             charset=cp1251_koi8&              charset=cp1251_koi8&
Line 160  odbc    c:\drives\y\parser3project\odbc\ Line 168  odbc    c:\drives\y\parser3project\odbc\
     !и есть исключение: ^untaint[html]{код} не оптимизируется       !и есть исключение: ^untaint[html]{код} не оптимизируется 
         Xбезотностительно флажка          Xбезотностительно флажка
   
     !у всех макросов есть локальная переменная $result, если в неё что положить,      !у всех методов есть локальная переменная $result, если в неё что положить,
     !то _это_ будет результатом макроса, а не его тело      !то _это_ будет результатом макроса, а не его тело
       !у всех методов есть локальная переменная $caller, в ней лежит родительский stack frame,
       !если туда записать
   
     !use(^use или @USE) ищет файл...      !use(^use или @USE) ищет файл...
     !1. ...если путь начинается с /, то считается, что это путь от корня веб пространства      !1. ...если путь начинается с /, то считается, что это путь от корня веб пространства
Line 216  odbc    c:\drives\y\parser3project\odbc\ Line 226  odbc    c:\drives\y\parser3project\odbc\
   
   
 !void  !void
       !^имя.length[]
           0
       !^имя.pos[...]
           -1
     !^имя.int[]  (default)       !^имя.int[]  (default) 
         0 или default          0 или default
     !^имя.double[] (default)      !^имя.double[] (default)
Line 243  odbc    c:\drives\y\parser3project\odbc\ Line 257  odbc    c:\drives\y\parser3project\odbc\
         пример:          пример:
         ^if(def $form:name) не пуста?          ^if(def $form:name) не пуста?
         ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]          ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]
     !^string::sql{query}[[$.limit(2) $.offset(4) $.default{n/a}]]      !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a}]]
         результат запроса должен быть один столбец/одна строка          результат запроса должен быть один столбец/одна строка
     !^имя.int[] .int(default) целочисленное значение строки.       !^имя.int[] .int(default) целочисленное значение строки. 
         если ломается преобразование, берётся default          если ломается преобразование, берётся default
Line 260  odbc    c:\drives\y\parser3project\odbc\ Line 274  odbc    c:\drives\y\parser3project\odbc\
     !^строка.match[шаблон][опции поиска]{замена}      !^строка.match[шаблон][опции поиска]{замена}
         опции поиска+=          опции поиска+=
         g заменить все вхождения, а не одно          g заменить все вхождения, а не одно
       !^строка.split[разделитель][[lrhv]]
           l слева направо [default]
           r справа налево
           h nameless таблица
           v таблица из столбца piece [default]
     !^строка.{l|r}split[разделитель] таблица из столбца $piece      !^строка.{l|r}split[разделитель] таблица из столбца $piece
           оставлен для совместимости
     !^строка.upper|lower[]       !^строка.upper|lower[] 
     X^строка.truncate(предел терпенья) стиль :(      X^строка.truncate(предел терпенья) стиль :(
     !^строка.length[]      !^строка.length[]
Line 281  odbc    c:\drives\y\parser3project\odbc\ Line 301  odbc    c:\drives\y\parser3project\odbc\
         логическое значение равно "не пуста?"          логическое значение равно "не пуста?"
         числовое значение равно count[]          числовое значение равно count[]
     !^table::create[[nameless]]{данные} старое имя "set"      !^table::create[[nameless]]{данные} старое имя "set"
     !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur]]]      !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]]
         клонирует таблицу              клонирует таблицу    
     !^table::load[[nameless;]путь]          reverse << сзаду на перёд (работает пока только в locate, в table::create НЕ работает)
       !^table::load[[nameless;]путь[;опции]]
         !если не nameless, названия колонок берутся из первой строки          !если не nameless, названия колонок берутся из первой строки
         !пустые строки, и строки в первой колонке содержащие '#', игнорируются                  !пустые строки, и строки в первой колонке содержащие '#', игнорируются        
     !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]]      !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]]
     !^таблица.save[[nameless|append;]путь]      !^таблица.save[[nameless|append;]путь]
     !$таблица.поле      !$таблица.поле
     !$таблица.fields+  из named таблицы выдаёт текущую запись как Hash      !$таблица.fields  из named таблицы выдаёт текущую запись как Hash
     !^таблица.menu{тело}[разделитель]      !^таблица.menu{тело}[разделитель]
     !^таблица.offset[[whence]](5) сдвигает; без параметра - печатает offset      !^таблица.offset[[whence]](5) сдвигает; без параметра - печатает offset
         !whence=cur|set          !whence=cur|set
Line 303  odbc    c:\drives\y\parser3project\odbc\ Line 324  odbc    c:\drives\y\parser3project\odbc\
     X^таблица.remove(position[;count]) - стирает запись       X^таблица.remove(position[;count]) - стирает запись 
         из текущей позиции [стирает запись из конкретной позиции]           из текущей позиции [стирает запись из конкретной позиции] 
             [стирает count записей]              [стирает count записей]
     !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]]        - добавляет записи из таблицы.       !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]]     - добавляет записи из таблицы. 
         таблицы должны иметь одинаковую структуру.          таблицы должны иметь одинаковую структуру.
     !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать      !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать
     !^таблица.locate[поле;значение] передвигает текущую строку, если найдёт. выдаёт bool      !^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] 
     !^таблица.locate(логическое выражение) передвигает текущую строку, если найдёт. выдаёт bool          передвигает текущую строку, если найдёт. выдаёт bool
     !^таблица.hash[поле, что будет ключом][[поле значений|table поля значений]]+      !^таблица.locate(логическое выражение)[[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]]
           передвигает текущую строку, если найдёт. выдаёт bool
       !^таблица.hash{[поле]|{код}|(выражение)}[[поле значений|table поля значений]][[$.distinct(1) $.distinct[tables]]]
         значением $hash.ключ будет hash в котором поля значений будут ключами          значением $hash.ключ будет hash в котором поля значений будут ключами
         поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой          поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой
           если distinct содержит true, то не будет ошибки при повторяющихся ключах
           если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом
     !^таблица.columns[]+ таблица из одного столбца $column      !^таблица.columns[]+ таблица из одного столбца $column
     !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало      !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало
             $adults[^man.select($man.age>=18)]          $adults[^man.select($man.age>=18)]
         ^таблица.color[цвет1;цвет2]      ^таблица.color[цвет1;цвет2]
   
   
 !hash  !hash
Line 324  odbc    c:\drives\y\parser3project\odbc\ Line 349  odbc    c:\drives\y\parser3project\odbc\
     !$hash.ключ      !$hash.ключ
         !_default - специальный ключ, если задан,           !_default - специальный ключ, если задан, 
         то при обращении по ключу, которому нет соответствия, выдаётся _default значение           то при обращении по ключу, которому нет соответствия, выдаётся _default значение 
       !$hash.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table
     !^hash::create[[!copy_from_hash|Xcopy_from_hashfile]]      !^hash::create[[!copy_from_hash|Xcopy_from_hashfile]]
         создаёт новый hash, копию старого          создаёт новый hash, копию старого
     !^hash.add[слагаемое]      !^hash.add[слагаемое]
Line 334  odbc    c:\drives\y\parser3project\odbc\ Line 360  odbc    c:\drives\y\parser3project\odbc\
     !^a.intersection[b] = пересечение      !^a.intersection[b] = пересечение
         значения a          значения a
     !^a.intersects[b] = bool      !^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(ключи=значения первая колонка ответа)          получается hash(ключи=значения первая колонка ответа)
         of hash(ключи=названия остальных колонкок ответа)          of hash(ключи=названия остальных колонкок ответа)
     !^hash._keys[]+ таблица из одного столбца $key      !^hash._keys[]+ таблица из одного столбца $key
Line 345  odbc    c:\drives\y\parser3project\odbc\ Line 371  odbc    c:\drives\y\parser3project\odbc\
 !form  !form
     [берётся первый элемент из одноимённых из GET, потом первый из POST]      [берётся первый элемент из одноимённых из GET, потом первый из POST]
     !$form:поле = string/file       !$form:поле = string/file 
       !$form:nameless = поле со значением поля без имени "?value&...", "...&value&...", "...&value"
       !$form:qtail = строка со значением текста после второго "?xxxxx", если там не было ',' [imap]
     !$form:fields = hash со всеми полями формы      !$form:fields = hash со всеми полями формы
     !$form:tables.поле = table с одним столбцом "field" со значениями "поля"      !$form:tables.поле = table с одним столбцом "field" со значениями "поля"
       !$form:imap = хэш с ключами 'x' и 'y'
           со значением ?1,2 приписки при использовании server-site image map
   
 !env  !env
     !$env:переменная      !$env:переменная
Line 378  odbc    c:\drives\y\parser3project\odbc\ Line 408  odbc    c:\drives\y\parser3project\odbc\
         !значение поля или атрибута может быть string или date          !значение поля или атрибута может быть string или date
         ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"          ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"
     !$response:body[DATA]  замещает стандартный ответ      !$response:body[DATA]  замещает стандартный ответ
       !$response:download[DATA]  замещает стандартный ответ, 
           выставляет флаг, заставляющий browser предложить download
     !$response:status      !$response:status
     !^response:clear[] забыть все заданные response поля      !^response:clear[] забыть все заданные response поля
     !$response:charset      !$response:charset
Line 543  Xhashfile Line 575  Xhashfile
     !$картинка[^image::measure[DATA]]      !$картинка[^image::measure[DATA]]
         смотрит на .ext case insensitive,           смотрит на .ext case insensitive, 
         умеет мерить пока только .gif и .jpg .jpeg          умеет мерить пока только .gif и .jpg .jpeg
       !$image.exif << hash после measure jpeg с exif информацией 
           !$image.exif.DateTime & co 
               [полный список см. http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html]
           !числа типа int/double,
           !даты типа date
           !перечисления в виде hash с ключами 0..count-1
     !$картинка.src .width .height      !$картинка.src .width .height
     !$картинка.line-width  число=ширина линий      !$картинка.line-width  число=ширина линий
        !$картинка.line-style строка=стиль линий '*** * '='*** * *** * *** * '         !$картинка.line-style строка=стиль линий '*** * '='*** * *** * *** * '
Line 586  Xhashfile Line 624  Xhashfile
     !^file:delete[имя файла]      !^file:delete[имя файла]
     !^file:find[имя файла][{когда не нашли}]      !^file:find[имя файла][{когда не нашли}]
     !^file:list[путь[;шаблон]] = table с колонкой name      !^file:list[путь[;шаблон]] = table с колонкой name
     !^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip]]      !^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip][;опции]]
     !$файл_который_был_loaded.size      !$файл_который_был_loaded.size
     !^file::stat[имя файла]      !^file::stat[имя файла]
     !$файл_который_был_stated.size !.adate !.mdate !.cdate      !$файл_который_был_stated.size !.adate !.mdate !.cdate
     !^file::cgi[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s]]]]]]]      !^file::cgi[имя файла[;env hash +options[;1cmd[;2line[;3ar[;4g[;5s]]]]]]]
         возвращённый заголовок рассыпается на $поля          возвращённый заголовок рассыпается на $поля
         $status          $status
         $stderr          $stderr
     !^file::exec[имя файла[;env hash $.stdin[текст][;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]]      !^file::exec[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]]
           options:
               $.stdin[текст]  если текст пуст, отключается автоматическое пересовывание данных HTTP-POST 
     !^file:move[старое имя файла;новое имя файла]       !^file:move[старое имя файла;новое имя файла] 
         можно переименовывать и двигать каталоги[win32: но не через границу дисков]          можно переименовывать и двигать каталоги[win32: но не через границу дисков]
         каталоги для dest создаются с правами 775          каталоги для dest создаются с правами 775
Line 610  Xhashfile Line 650  Xhashfile
     !^file:basename[/a/some.tar.gz]=some.tar.gz      !^file:basename[/a/some.tar.gz]=some.tar.gz
     !^file:justname[/a/some.tar.gz]=some.tar      !^file:justname[/a/some.tar.gz]=some.tar
     !^file:justext[/a/some.tar.gz]=gz      !^file:justext[/a/some.tar.gz]=gz
       !/some/page.html: ^file:fullpath[a.gif] => /some/a.gif
   
   
 math  math
     !$math:PI      !$math:PI
Line 622  math Line 664  math
     !^math:pow sqrt      !^math:pow sqrt
     !^math:random(ширина диапазона)      !^math:random(ширина диапазона)
     ^math:GUID {C2C0983C-E26E-4169-BD07-77ECE9405BA5}      ^math:GUID {C2C0983C-E26E-4169-BD07-77ECE9405BA5}
       !^math:md5[string]
           выдает digest строки, длиной 16 байт в виде строки, 
           где байты digest выданы в hex виде, впритык, в нижнем регистре
     !^math:crypt[password;salt]      !^math:crypt[password;salt]
        salt prefix $apr1$ вызывает встроенный MD5 алгоритм,          salt prefix $apr1$ вызывает встроенный MD5 алгоритм, 
          если нет тела salt, оно создаётся случайным           если нет тела salt, оно создаётся случайным
Line 685  xdoc(xnode) Line 730  xdoc(xnode)
     !::create[[URI]][qualifiedName]      !::create[[URI]][qualifiedName]
       URI default = disk path to requested document        URI default = disk path to requested document
       для каталогов конечный / обязателен        для каталогов конечный / обязателен
     !::load[file.xml]      !::load[file.xml[;опции]]
     !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom      !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom
         шаблон кэшируется, кэш обновляется при изменении даты файла шаблона,          шаблон кэшируется, кэш обновляется при изменении даты файла шаблона,
         или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее]          или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее]
Line 817  xdoc(xnode) Line 862  xdoc(xnode)
         does not support data          does not support data
         NO_MODIFICATION_ALLOWED_ERR          NO_MODIFICATION_ALLOWED_ERR
         If an attempt is made to modify an          If an attempt is made to modify an
         object where modifications are not              object where modifications are not
         allowed          allowed
         NOT_FOUND_ERR          NOT_FOUND_ERR
         If an attempt was made to reference a          If an attempt was made to reference a
Line 844  xdoc(xnode) Line 889  xdoc(xnode)
             url    time                  url    time    
             url    time                  url    time    
             url    time                  url    time    
     !$status:db hash  
         !cache hash db_home=>tables table  
             name    time    users  
             name    time    users  
             name    time    users  
     !$status:stylesheet      !$status:stylesheet
         !cache table          !cache table
             file    time              file    time
Line 867  xdoc(xnode) Line 907  xdoc(xnode)
         !ixrss integral shared text memory size          !ixrss integral shared text memory size
         !idrss integral unshared data size          !idrss integral unshared data size
         !isrss integral unshared stack 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  !DATA::=string | file
   
Line 899  xdoc(xnode) Line 944  xdoc(xnode)
         там лежат в обратном порядке имена[name] и места вызовов[file line]           там лежат в обратном порядке имена[name] и места вызовов[file line] 
         операторов/методов, приведших к ошибке.          операторов/методов, приведших к ошибке.
   
   !при загрузке файла (file::load, table::load, xdoc::load) можно указать такое имя файла:
       !http://domain/document?params
       !а также, возможно, указать опции:
           !$.method[GET|HEAD]
           !$.timeout(3)  << в секундах, по-умолчанию =2
           !$.headers[
           !    $поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК
           !]
           !по-умолчанию, user-agent=parser3
           !по-умолчанию, получение http status != 200 >> создает http.status ошибку,
           !это можно отключить, передав
           !$.any-status(1)
       !file::load в дополнительные поля записывает ПОЛЕ:значение (имена полей ответа заглавными буквами)
   
 !системные типы ошибок:  !системные типы ошибок:
     !parser.compile       ^test[}                компиляция (непарная скобка, ...)      !parser.compile       ^test[}                компиляция (непарная скобка, ...)
     !parser.runtime       ^if(0).                параметры (больше/меньше, чем нужно, не тех типов, ...)      !parser.runtime       ^if(0).                параметры (больше/меньше, чем нужно, не тех типов, ...)
Line 907  xdoc(xnode) Line 966  xdoc(xnode)
     !file.lock                                                        shared/exclusive lock error      !file.lock                                                        shared/exclusive lock error
     !file.missing         ^file:delete[delme]                         not found      !file.missing         ^file:delete[delme]                         not found
     !file.access          ^table::load[.]                             no rights      !file.access          ^table::load[.]                             no rights
       !file.seek                                                        seek failed
     !image.format         ^image::measure[index.html]                 not gif/jpg      !image.format         ^image::measure[index.html]                 not gif/jpg
     !sql.connect          ^connect[mysql://baduser:pass@host/db]{}    not found/timeout      !sql.connect          ^connect[mysql://baduser:pass@host/db]{}    not found/timeout
     !sql.execute          ^void:sql{select bad}                       syntax error      !sql.execute          ^void:sql{select bad}                       syntax error
Line 919  xdoc(xnode) Line 979  xdoc(xnode)
     !smtp.execute                                                     communication error      !smtp.execute                                                     communication error
     !email.format         hren tam@null.ru                            wrong email format(bad chars/empty)      !email.format         hren tam@null.ru                            wrong email format(bad chars/empty)
     !email.send           $MAIL.sendmail[/shit]                       sendmail not executable      !email.send           $MAIL.sendmail[/shit]                       sendmail not executable
       !http.host            ^file::load[http://notfound/there]          host not found
       !http.connect         ^file::load[http://not_accepting/there]     host found, but do not accept connections
       !http.timeout         ^file::load[http://host/doc]                whole load operation failed to complete in # seconds
       !http.response        ^file::load[http://ok/there]                host found, connection accepted, bad answer
       !http.status          ^file::load[http://ok/there]                host found, connection accepted, status!=200
           
 !нужно выключить русский apache: CharsetDisable on  !нужно выключить русский apache: CharsetDisable on
   

Removed from v.1.75  
changed lines
  Added in v.1.112


E-mail: