|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Коллеги, буду благодарен, если кто-то сможет поделиться соображениями по данному поводу. Дано: Cache 2012.2.5 - 2015.1.2. Локаль: ^%SYS("LOCALE","CURRENT")="ruw8" Таблица сортировки: Cyrillic2 или Cache standard (не важно). Вопрос: Есть ли разумное объяснение такой сортировке? kill b set a=1E30,b(+a)=1,b(+a_"1")=3,b(+a_"1a")="3a" set a=3E30,b(+a)=2,b(+a_"1")=4,b(+a_"1a")="4a" set b($c(2))="??" zwrite b Код: plaintext 1. 2. 3. 4. 5. 6.
При этом стандартная проверка локали: kill b for i=0:1:127 s b($c(i))=iпроходит нормально: сначала числа, потом строки в порядке возрастания кодов ASCII. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:06 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Alexey Maslov Код: plaintext 1.
очевидно, что эти узлы сортируются как числовые, несмотря на то что отображаются как строки когда они точно становятся строками, тогда уже точно сортируются нормально но это уже вопрос к IS, корректно ли что строки которые только с числами сортируются как числа, а не как строки у меня так же сортируется Cache for Windows (x86-64) 2016.1 (Build 596U) Mon Nov 9 2015 21:12:55 EST ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:17 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Alexey Maslov, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
У меня с записями маркированными как 3 и 3а что-то куда-то вообще уехало... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:31 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
DAiMor, Вот и мне так показалось. Кстати, результат такой же, даже если подобное "псевдочисло" вызывает числовое переполнение, например: USER>s j=310,n=$tr($j("",j)," ",1) set b(n)=j zw b b(1000000000000000000000000000000)=1 b(3000000000000000000000000000000)=2 b("10000000000000000000000000000001")=3 b("30000000000000000000000000000001")=4 b("11111111111111111111111111111111111111...111")=310 b($c(2))="c2" b("10000000000000000000000000000001a")="3a" b("30000000000000000000000000000001a")="4a" USER>w n=+n W n=+n ^ <MAXNUMBER> ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:31 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
сорри, только заметил что в тесте не менял a ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:32 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
ну я, "а что нам скажет товарищ MiniM"? Проще выполнять однострочник:k b s a=1E30,b(+a)=1,b(+a_"1")=3,b(+a_"1a")="3a",a=3E30,b(+a)=2,b(+a_"1")=4,b(+a_"1a")="4a",b($c(2))="c2" zwrite b ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:36 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:47 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
b("☻")="c2"Тут в индексе в досовой кодировке рожица должна быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:49 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
ну я, спасибо, в MiniM сортируется, как и ожидается, хотя, похоже, есть (другая) ошибка. Согласно Стандарту, унарный плюс (как и любая арифметическая операция) должен привести число к каноническому виду, e.g. Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:58 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Это наверное не объяснение, но в документации есть абзац про порядок сортировки чисел и строк: Numeric and String-Valued Subscripts Обратите внимание, что порядок сортировки строк не обязательно совпадает с порядком кодов символов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 14:01 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Александр Коблов, спасибо, об этом знаем :) не случайно ведь привёл: При этом стандартная проверка локали: kill b for i=0:1:127 s b($c(i))=i проходит нормально: сначала числа, потом строки в порядке возрастания кодов ASCII.К тому же в пределах первой половины таблицы ASCII никаких чудес быть не должно (согласно Стандарту языка ISO/M). В качестве попытки объяснения можно было бы привести результат выполнения $isvalidnum, однако: set j=310,n=$tr($j("",j)," ",1) for i="10000000000000000000000000000001","30000000000000000000000000000001",n { w $isvalidnum(i)_" $length(i)="_$l(i)_" i="_i,! ;_" i=+i:"_(i=+i),! } Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 14:16 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Коллеги, понимаю, что, наверное, уже надоел, и, конечно, обращусь в WRC, но может кто-нибудь для статистики выполнить пресловутый однострочник в MSM? Я почти уверен в результате, но всё же... k b s a=1E30,b(+a)=1,b(+a_"1")=3,b(+a_"1a")="3a",a=3E30,b(+a)=2,b(+a_"1")=4,b(+a_"1a")="4a",b($c(2))="c2" zwrite b ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 15:38 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Alexey Maslov, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 15:41 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Уже подзабыл, дружит ли MSM с управляющими в индексах, если нет, то последнее присваивание (b($c(2))="c2") можно смело выкинуть, т.к. $c(2) в Cache сортируется правильно и не влияет на суть примера. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 15:44 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
ну я, ещё раз спасибо. Похоже, у основных "M-соседей" сортируется правильно, бяка только в Cache. Не имею доступа к экзотике типа M21 и MumpsV1, но это уже не столь важно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 15:49 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Alexey Maslov, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 16:01 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Valeriu, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 16:44 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Alexey MaslovВопрос: Есть ли разумное объяснение такой сортировке?Пока всё согласно документации: Именно поэтому "1111111111111111...11111111111111111" сортируется как число, а не строка, хотя это строка.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Но достаточно жёстко указать Caché воспринимать её как строку, как она уже сортируется как строка, например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 17:10 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
servit, у вас другой код, и другие результаты. Свой пример я ещё немного доработал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
1) числа - сортируются как числа 2) не числа - сортируются алфавитно. А мы видим три: 1) числа - сортируются как числа (1-3) 1*) "псевдочисла" - сортируются как числа (11-333) 2) не числа - сортируются алфавитно (3a-4a). (Временно) прекращаю обсуждение, т.к. открыл проблему в WRC. Если ISC не будет возражать, отпишусь о результатах. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 18:04 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
servit, напоследок приведу модифицированный пример без комментариев. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 18:36 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Alexey Maslov, у вас числа больше максимально возможного целого числа в Cache 2^63-1 = 9223372036854775807. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 21:51 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
eduard93, правильно. Тогда вопрос, почему Cache считает их числами: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2015, 08:05 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Возможно, дело в этом: Cache ObjectScript Reference $DOUBLENote: A Cache numeric string literal that exceeds the min/max range supported by Cache floating point data types (for example, “1E128”) is automatically converted to an IEEE double-precision floating point number. This conversion is only performed on numeric literals; it is not performed on the results of mathematical operations. This automatic conversion can be controlled on a per-process basis using the TruncateOverflow() method of the %SYSTEM.Process class. The system-wide default behavior can be established by setting the TruncateOverflow property of the Config.Miscellaneous class.Это объясняет поведение $isvalidnum, но не оправдывает сортировку, которая должна подчиняться не внутренней функции, а Стандарту, который в этой важной части, как мы вчера увидели, неплохо соблюдается в других М-системах. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2015, 08:24 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Alexey Maslov, Какому такому стандарту? :) (Он был про другой язык, он не активен, он сообществу не нужен и не поддерживается) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2015, 12:26 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Timur Safin, тем не менее, в документации немало ссылок на Стандарт ISO 11756-1999 (поиск работает :). Вот, например, в тему: RoutinesWhen you create routines in Cache, you can choose the programming language for each routine. The choices are as follows: Cache ObjectScript, which is a superset of the ISO 11756-1999 standard M programming language. If you are an M programmer, you can run your existing M applications on Cache with no change. Timur SafinОн был про другой язык, он не активен, он сообществу не нужен и не поддерживаетсяРасскажите об этом, например, участникам этого сборища , им полезно будет узнать, что они "скорее мертвы, чем живы". Стоит ли объяснять, зачем нужна обратная совместимость со Стандартом, кстати, весьма хорошо обеспечиваемая в Cache? Случайно найденное мною исключение лишь подтверждает правило :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2015, 13:01 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Замыкая круг. Разработчик в принципе подтвердил моё рассуждение в 18564206 , только вот никаких псевдочисел нет: "In ANSI collation, any number (or string that is in canonic numeric form) is collated numerically, before all non-numeric strings." Причём это не всегда было так, а начиная с какой-то версии (не сказали с какой, но видимо c довольно давней). Не важен ни результат $isvalidnum, ни возможный <MAXNUMBER> при "классической" проверке на число: n=+n. Не стал бы и писать об этом, но механизм сортировки один из "ядерных", и его непонятное поведение меня встревожило. Теперь успокоили :) Всем спасибо, кто поучаствовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2015, 19:52 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
Alexey Maslov"In ANSI collation, any number (or string that is in canonic numeric form) is collated numerically, before all non-numeric strings." Причём это не всегда было так, а начиная с какой-то версии (не сказали с какой, но видимо c довольно давней). Это с SPJ932 присутствующем в продукте еще с 1993(!) года. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2015, 23:41 |
|
Почему так сортируются строки?
|
|||
---|---|---|---|
#18+
servit, спасибо, правда я и тогда всё понял :). Однако лучше бы для большей понятности автор поста употребил оператор ]], а не ], т.к. ] трактуется как "следует-за в порядке кодов символов без учёта специфики числовой сортировки". Для преодоления этого недостатка и был когда-то добавлен в язык Стандарта ISO/1995 оператор ]] - "следует-за в порядке действующей Collation". Мой старый пример, расширенный примером автора, наглядно показывает разницу: Код: plaintext 1. 2. 3. 4.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2016, 13:57 |
|
|
start [/forum/topic.php?all=1&fid=39&tid=1556460]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 146ms |
0 / 0 |