Если у меня есть переменная my $a = True
, я получаю этот вывод из следующего кода:
say «a list of words foo $a bar baz».raku;
# OUTPUT: ("a", "list", "of", "words", "foo", "True", "bar", "baz")
То есть, даже если результатом является List
, элемент True
преобразовывается в строку перед включением в список - список содержит "True"
, а не True
. Есть ли способ избежать этой строковой обработки при использовании интерполяции?
Был бы способ сделать это, если бы $a
был классом, который я определил (и, следовательно, мог бы написать метод Str
), а не Bool
?
(Я знаю, что могу написать более подробный ("a", "list", "of", "words", "foo", $a, "bar", "baz")
или «a list of words foo».Slip, $a, «bar baz».Slip
, но я спрашиваю, есть ли способ по-прежнему использовать интерполяцию).
sub f(--> Int) { 'Oops' }
недействителен во время компиляции. Я не имею в виду, что для Raku невозможно написать статический анализатор; очевидно, что это не так. И я не имею в виду, что Раку никогда не сможет этого сделать. Я просто имею в виду, что сейчас не может. - person codesections   schedule 16.03.2021BEGIN { f }
, и результатом будет ошибка времени компиляции. Чтобы было ясно, я понял и понимаю, чем вы были и что говорите. Мой комментарий был адресован не вам лично, а в первую очередь для более поздних читателей, которые могут неверно истолковать, что можно, а что нельзя. Некоторые PL никогда не смогут дать разработчикам возможность переводить вещи из времени выполнения во время компиляции, но Raku уже делает это, и скоро появятся новые возможности. Как вы говорите, разработчики могут написать статический анализатор, и, как заметил jnthn, часть ближайшего плана развития позволяет реализовать средства проверки типов в виде модулей. - person raiph   schedule 16.03.2021NA
и сохраняют его как есть (т.е. не преобразовывают в строку во время интерполяции). - person jubilatious1   schedule 26.03.2021