Scala квазицитирование
От: x-code  
Дата: 11.06.24 08:49
Оценка:
Поясните вот с таким вопросом. Вот здесь
https://docs.scala-lang.org/scala3/guides/macros/quotes.html
(а также перевод на русском https://scalabook.ru/scala/metaprogramming/quoted-code.html , там то же самое)
Есть такие примеры кода — примеры того как делать нельзя. У меня такое чувство что пояснения к фрагментам кода перепутаны. Но возможно я чего-то не понимаю.

раздел Level consistency / Согласованность уровней

One cannot simply write any arbitrary code within quotes and within splices, as one part of the program will live at compile-time and the other will live at runtime. Consider the following ill-constructed code:
def myBadCounter1(using Quotes): Expr[Int] = {
  var x = 0
  '{ x += 1; x }
}

The problem with this code is that x exists during compilation, but then we try to use it after the compiler has finished (maybe even in another machine). Clearly, it would be impossible to access its value and update it.

Now consider the dual version, where we define the variable at runtime and try to access it at compile-time:
def myBadCounter2(using Quotes): Expr[Int] = '{
  var x = 0
  ${ x += 1; 'x }
}

Clearly, this should not work as the variable does not exist yet.

Первый фрагмент кода. Функция, в ней локальная стековая переменная. И дальше функция возвращает объект — фрагмент синтаксического дерева, ссылающийся на эту стековую переменную. Я не знаю захватывает ли синтаксическое дерево какие-то указатели на реальные объекты, если да — то это типа как в С/С++ вернуть адрес локальной переменной (т.е. ошибка). Если нет — то не вижу никаких проблем, ну вернули фрагмент синтаксического дерева и фиг с ним.

Второй фрагмент кода. Возвращается большая квазицитата, внутри которой объявляется переменная (при выполнении кода она не объявляется т.к. это просто часть цитаты), и дальше сплайсинг (интерполяция) — кусочек кода, который срабатывает непосредственно при формировании цитаты. В этом кусочке кода переменная (не существующая) увеличивается на 1, т.е. явно должна быть ошибка компиляции, и дальше вложенное цитирование, т.е. узел синтаксического дерева, представляющий "x" подставляется во внешнюю цитату.

Я правильно все понял? Тогда как это соотносится с комментариями в книге?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.