Думаю, это баг, но не в наборе. Другие ответы очень помогли разобраться в том, что было важным, а что нет.
Я использовал форму кавычек в угловых скобках. Форма цитатных слов должна быть эквивалентна цитируемой версии (то есть True в eqv
). Вот пример документа:
<a b c> eqv ('a', 'b', 'c')
Но когда я пробую это со словом, состоящим только из цифр, это не работает:
$ perl6
> < a b 137 > eqv ( 'a', 'b', '137' )
False
Но другие формы работают:
> qw/ a b 137 / eqv ( 'a', 'b', '137' )
True
> Q:w/ a b 137 / eqv ( 'a', 'b', '137' )
True
В кавычках угловых скобок используется IntStr:
> my @n = < a b 137 >
[a b 137]
> @n.perl
["a", "b", IntStr.new(137, "137")]
Без кавычек слово цифр выглядит как [Str]:
> ( 'a', 'b', '137' ).perl
("a", "b", "137")
> ( 'a', 'b', '137' )[*-1].perl
"137"
> ( 'a', 'b', '137' )[*-1].WHAT
(Str)
> my @n = ( 'a', 'b', '137' );
[a b 137]
> @n[*-1].WHAT
(Str)
Обычно вы видите ошибки такого рода, когда есть два пути кода для получения окончательного результата, а не общий код, который очень рано сходится к одному пути. Это то, что я бы искал, если бы хотел отследить это (но мне нужно поработать над книгой!)
Однако это подчеркивает, что вы должны быть очень осторожны с наборами. Даже если эта ошибка была исправлена, есть и другие, не связанные с ошибками способы eqv
могут выйти из строя. Я бы все равно потерпел неудачу, потому что 4 как Int не равно «4» как Str. Я думаю, что такой уровень внимания к типам данных неадекватен в DWIMery. Это определенно то, что мне пришлось бы очень осторожно объяснять в классе и при этом наблюдать, как все на этом не ладят.
Как бы то ни было, я думаю, что результаты gist
имеют тенденцию вводить в заблуждение из-за их чрезмерного упрощения, а иногда результаты perl
недостаточно богаты (например, скрытие Str
, что вынуждает меня .WHAT
). Чем больше я их использую, тем менее полезными я считаю их.
Но знание того, что я напортачил еще до того, как я начал, спасло бы меня от этой спелеологии кода, которая в конечном итоге ничего не значила!
person
brian d foy
schedule
26.11.2016