Можно ли интерполировать переменные или константы без сигилов? - PullRequest
0 голосов
/ 19 января 2019

Хотя я не нашел документации для этого, очевидно, вы можете интерполировать переменные без сигил и окружающие их константы с помощью {}:

constant ⲧ = " " xx 4;
say "{ⲧ}Tabbed"; # OUTPUT: «       Tabbed␤»

Очевидно, вам нужно использовать наречие :c для этого .

say q:c"π is {π}"; # OUTPUT: «π is 3.141592653589793␤»

Но это только в том случае, если используются q (и производные) кавычки. Это просто недокументированная функция или я что-то упускаю здесь?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Все они абсолютно идентичны

          "a $b {$c}"
qq        "a $b {$c}"
Q :qq     "a $b {$c}"
Q :double "a $b {$c}"

Q :b :s :a :h :c :f "a $b {$c}"
Q :backslash :scalar :array :hash :closure :function "a $b {$c}"

Чтобы синтаксический анализатор строковых литералов видел {} как создающее замыкание, ему необходимо включить функцию замыкания.

Один из:qq / :double включает :c / :closure.

. Вы также можете отключить его с помощью :!closure.

say qq :!closure "{ 1 + 2 }";
# { 1 + 2 }

То есть он запускаетсяс :qq / :double семантикой и отключением :closure семантики.


Здесь - это то, где функция qq определена в Rakudo

role qq does b1 does c1 does s1 does a1 does h1 does f1 {
    token starter { \" }
    token stopper { \" }
    method tweak_q($v) { self.panic("Too late for :q") }
    method tweak_qq($v) { self.panic("Too late for :qq") }
}

b1 включает обратную косую черту
c1 включает закрытие
s1 включает скаляр
a1 включает массив
h1 включает хэш
f1 включает функцию


Это задокументировано, и вы предоставили ссылку на документацию.
Возможно, можно пояснить, что:

  • "" - это сокращение от qq ""
  • qq "" - сокращение от Q :qq "" / Q :double ""
  • :qq / :double сокращение от всех :backslash :closure :scalar :array :hash :function.

Также, возможно, стоит добавить примеры для всех этих функций.

0 голосов
/ 19 января 2019

Я не рассматриваю это как недокументированную функцию, а скорее присущую дизайну существующих функций.

A double строка кавычек ("...") интерполирует выраженияФорма {...} в виде кода.Так что это просто работает.

A q кавычка, по умолчанию, похожа на одиночную строку кавычки ('...').Таким образом, по умолчанию он не интерполирует выражения вида {...}.Но если вы добавите наречие c, тогда интерполирует эти блоки c ode, так что то же самое, что работает в строках с двойными кавычками по умолчанию, также работает с q:c.

Или, может быть Я что-то упустил.Кажется, мы дополняем наши слепоты.Вместе у нас может быть видение 50/50, что бы это ни значило.:)

...