Re: Конвертация внутре ннего представления переменных в Tcl

2009-10-08 Пенетрантность Victor Wagner
On 2009.10.08 at 15:31:09 +0400, Alexey Pechnikov wrote:

Hello!
 
В tcl-расширении потребовалось определить тип данных в
 
переменной, что реализуется проверкой возвращаемого значения
 
функции Tcl_ConvertToType(interp, objPtr, typePtr)

Вообще-то она не это делает. Она пытается преобразовать текущее
представление данных в указанный тип, и если не получается, возвращает
TCL_ERROR.

Поэтому использовать этот механизм для проверки типа - занятие довольно
стремное. А вдруг там была строка, которую почему-либо УДАЛОСЬ
преобразовать в boolean, но имелось в виду совсем не это?

Я бы ПРОВЕРЯЛ тип объекта посредством

strcmp(obj-typePtr-name,ожидаемый тип)

(благо, и поле typePtr в Tcl_Obj, и поле name в Tcl_ObjType -
документировано)

При таком подходе я могу быть увереным, что никаких неявных
преобразований моя проверка не вызвала.

(а то напарывался я как-то с такой проверкой. Была у меня структурка
данных с 6-мегабайтным строковым представлением, и из-за ошибки в
расширении, куда в качестве параметра могла быть передана либо эта
структурка в виде моего собственного ObjType, либо список, оно
по циклу сериализовывалось/десериализовывалось столько раз, сколько
строк было в этой таблице. А все из-за того, что я сначала попытался
проверить, не список ли это, и оно честно пыталось сконвертить объект в
списочное представление). 


Вопрос: каким образом в расширении выполнить конвертацию
 
типа данных переменной, не таская с собой все исходники Tcl?

В норме это делается так - просишь сконвертить в НУЖНЫЙ тебе тип.
Чем-то типа Tcl_GetBooleanFromObj. А оно уж само разбирается, что там
было, и как можно это сконвертить. Ну и возвращает TCL_ERROR, ежели не
получилось.

Вот со строками и ByteArray ситуация может быть значительно веселее.
Если ты не знаешь по смыслу, бинарные у тебя данные или нет, то
определить какое представление тебе больше подходит - строковое или
ByteArray - штука весьма затруднительная, особенно в задачах где бывает
и то, и то, например в задачах электронной подписи.


-- 
To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org
with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org



Re: Конвертация внутре ннего представления переменных в Tcl

2009-10-08 Пенетрантность Victor Wagner
On 2009.10.08 at 17:04:50 +0400, Alexey Pechnikov wrote:

 Hello!
 
 Собственно, сейчас делаю так
 Tcl_ObjType *tclBooleanType = Tcl_GetObjType(boolean);
 
 Но обычной практикой является использование констант,
 здесь же приходится делать вызов функции, что не очень 
 приятно. 

Ну, можно все необходимые типы запросить в Init-функции
твоего расширения. Если, ты, конечно уверен, что в момент выполнения
этой функции все расширения, которые могут реализовывать интересные тебе
типы, уже загружены.

Так что вызов функции будет ровно один за период жизни твоего
интерпретатора. А дальше у тебя будет статическая переменная.



 Best regards, Alexey Pechnikov.
 http://pechnikov.tel/


-- 
To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org
with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org



Re: Конвертация внутре ннего представления переменных в Tcl

2009-10-08 Пенетрантность Victor Wagner
On 2009.10.08 at 22:38:55 +0400, Alexey Pechnikov wrote:
  (благо, и поле typePtr в Tcl_Obj, и поле name в Tcl_ObjType -
  документировано)
 
 Ситуация как раз в том, что апстрим sqlite делает именно проверку по 
 obj-typePtr-name 


 В итоге оказывается, что один и тот же тиклевский код из скрипта
 и в tclsh шелле дает _разный_ результат:
 
 
 $ tclsh8.5 /tmp/test
 1.0 ERROR   integer!=text
 1.1 OK
 1.2 ERROR   1!=
 1.3 OK
 1.4 OK
 

А вот тут НЕ НАДО делать проверку. Благо требуемый тип известен.
Надо не проверять, а пытаться преобразовать данные к требуемому типу.
И ругаться только если не получилось. 

Соответствено, Tcl_GetWideIntFromObj.

При этом таблица преобразований должна быть не тикловая внутренняя,
поскольку  никто не обещал, что завтра внутреннее представление 
integer не поменяют на несовместимое с нужным тебе, а своя собственная,
использующая для преобразования Tcl_Get*FromObj. Поскольку у них тип
результата документирован.




-- 
To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org
with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org