[Moscow.pm] компиляция XS на BSD

Vladimir Timofeev vovkasm на gmail.com
Вс Фев 13 03:12:50 PST 2011


2011/2/13 Ivan Petrov <i.petro.77.00 на gmail.com>:
> допустим у нас есть SV *sv; // $val = \\5;
>>
>> тогда:
>> SvROK(sv) == true
>> SvIOK(sv) == false
>> SvROK(SvRV(sv)) == true
>> SvIOK(SvRV(sv)) == false
>> SvIOK(SvRV(SvRV(sv))) == true
>> SvROK(SvRV(SvRV(sv))) == false
>> Ни раньше, ни сейчас извращаться не надо.
>>
>
> c этими макросами-то все ясно, речь-то шла о других, об SvTYPE, а с ним
> теперь будет
>
> SVt_IV == SvTYPE(SvRV(sv))) и SVt_IV == SvTYPE(SvRV(SvRV(sv))))
>
> это приводит к тому что надо switch заменять на if'ы или окружать это
> ifdef'ами, если мы хотим в switch отделять "ссылку на ссылку" от "ссылки на
> int"
>
> а замена switch на многострочный if - else if это именно извращение.
Ну... не я эти макароны писал ))

Просто в данном случае SvTYPE говорит, не о том "что содержится в SV",
а о том какя "у SV внутренняя структура" (это мое предположение).
Т.е. в частности, где лежит значение и какие еще поля доступны... А за
то, как этим значением можно воспользоваться отвечают флаги, типа
SVf_ROK.
Но это философия, в общем... я бы в коде очень упрощенно использовал
что-то вроде:
если пусто: ...
если RV: разобраться с объектами, магией и рекурсия по ссылке
иначе: все остальное
Конечно все очень сильно зависит от того, что надо в итоге получить...
допустим Storable должен знать о внутренностях и зеркалировать всю
структуру, чтобы иметь возможность восстановить назад, а JSON этого
делать не обязан, ему достаточно знать, что если не RV, то если можно
получить NV или IV, то выкинуть чило, а если нельзя, то взять
строку...


>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>



-- 
Vladimir Timofeev <vovkasm на gmail.com>


Подробная информация о списке рассылки Moscow-pm