|
Почему так сортируются строки?
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=39&msg=39128522&tid=1556460]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 160ms |
0 / 0 |