Изменение поведения с Rebol 2 на Rebol 3 для пустого BITSET! тестирование; как проверить ПУСТОЙ?

В Rebol 2 вы могли проверять наличие пустого битового набора с помощью EMPTY?

>> empty? make bitset! #{00}
== true

В Rebol 3 (сборка 21 февраля 2011 г. / 0: 44: 24) это не так.

>> empty? make bitset! #{00}
== false

Ошибка или новое поведение? В любом случае, как еще я могу пройти этот тест? Пустые битовые наборы разных размеров не сравниваются как равные ни в R2, ни в R3:

>> (make bitset! #{00}) == (make bitset! #{0000})
== false

person HostileFork says dont trust SE    schedule 19.11.2012    source источник


Ответы (2)


Новое поведение: битовый набор с> 0 битами не пуст; даже если в нем не установлены биты, он все равно содержит очищенные биты.

В R3 вы можете or заданный битовый набор с пустым битовым набором, чтобы узнать, пуст ли первый, то есть: у него также нет установленных битов:

>> empty? (make bitset! #{00}) or (make bitset! #{})
== true

>> empty? (make bitset! #{0000}) or (make bitset! #{})
== true

В качестве удобного ярлыка вы также можете просто or с пустым binary!, включив следующее определение:

bitset-clear?: func [bitset [bitset!]] [empty? bitset or #{}]

Опять же, используя ваши примеры:

>> bitset-clear? make bitset! #{00}   
== true

>> bitset-clear? make bitset! #{0000}
== true
person earl    schedule 20.11.2012
comment
Попался. Я подумал, что это было слишком элементарно, чтобы быть ошибкой, но я до сих пор не совсем понимаю причину изменения. Исправление работает, и Cyphre предложила то же самое. (Еще раз обратите внимание на связь в чате. Можем ли мы привлечь больше людей Rebol, чтобы они осознали ценность StackExchange? Помогите мне здесь.) Это похоже на небольшой контракт, чтобы зависеть от этого неизменяемого свойства ИЛИ, но если это правило, то это правило ...: - / - person HostileFork says dont trust SE; 20.11.2012
comment
Обоснование может происходить из последовательной интерпретации битовых наборов (я добавил предложение к этой мотивации). Но потом, немного! не входит в сериал! наборный. - person earl; 20.11.2012
comment
Я согласен с @HostileFork, это невероятно странное поведение. Мне пришлось перечитать эту запись несколько раз, чтобы понять, что происходит с or и пустым битовым набором. Это кажется чрезмерно сложным по сравнению с очень простым и понятным поведением EMPTY? в R2 ... - person DocKimbel; 19.12.2013

Это может быть одно из различий в способе построения битовых наборов между R2 и R3. Это все еще сохраняется в R3 (A111):

>> eb: charset []
== make bitset! #{}

>> empty? eb
== true
person rgchris    schedule 19.11.2012
comment
После вашей нестандартной работы над вопросом CSV, мне неприятно указывать на то, что это не ответ сам по себе. :-) Есть идеи обходного пути? - person HostileFork says dont trust SE; 19.11.2012
comment
Достаточно честно :) Ясно, что не прочитал вопрос должным образом. На мой взгляд, это определенно ошибка. - person rgchris; 19.11.2012