?

Log in

No account? Create an account

Метапрограммирование в Агде и немного философии - Excelsior

Aug. 27th, 2013

09:49 am - Метапрограммирование в Агде и немного философии

Previous Entry Share Next Entry

Comments:

From:Valentin Budaev
Date:September 3rd, 2013 01:33 am (UTC)
(Link)
> Позишены (так у нас называются source locations) тянуть уже можно прямо сейчас

Так это же замечательно! :)
Кстати, сразу - очень неплохо было бы, чтобы стандартным поведением макроса был перенос positions с АСТ, которое макрос получил на входе, на АСТ, которое макрос дает на выходе. В Racket, например, не так, и по-хорошему надо обрамлять 90% макросов в syntax/loc, при этом в макроформах типа define-simple-macro/define-syntax-rule этого сделать нельзя (т.к. нельзя написать код первой фазы) и они получаются по умолчанию немного "поломанными".

Еще, кстати, пара вопросов:
1. Как я понимаю, macro-generated macro в скале сделать не получится?

2. Экспанд происходит во время тайпчека?

3. Такой пример:

object Macro {
  def fun = ...
  def macroImpl(c: Context)(...) = ...
}


здесь fun можно использовать как в коде самого макроса, так и внутри цитаты? То есть аналога разделению на фаз нету, стейт общий, как в CL, например?

4. Я так понял, у вас сразу в макросе происходит деконструкция АСТ на аргументы, например:

def assertImpl(c: Context)
    (cond: c.Expr[Boolean], msg: c.Expr[Any]) : c.Expr[Unit] =


Есть ли способы обратиться к исходному, не разобранному на аргументы (cond, expr) АСТ? Если нет - теряется потенциально полезная информация.

Edited at 2013-09-03 01:39 am (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 3rd, 2013 07:48 am (UTC)
(Link)
0. По умолчанию макрос не трогает позиции деревьев, которые приходят ему на вход. Синтетические деревья, которым позиция не сопоставлена, получают позицию макро вызова, который сейчас раскрывается.

1. Пока что нет, но есть планы. Не знаю, как это делается в Схеме, но я планирую это сделать через интерпретацию деревьев. Раньше меня останавливало то, что такая интерпретация неизбежно будет довольно убогой, но опыт D меня вдохновил. CTFE вначале действительно был совсем слабенький, но потом они наворачивали все больше и больше и сейчас там уже поддерживается здоровенный кусок языка.

2. В основном, да. Макро аннотации, которые могут добавлять/удалять мемберы, раскрываются до тайпчека.

3. Разделения фаз нету потому, что раскрытие макросов и исполнение кода, получившегося в результате раскрытия, сейчас не могут происходить в одном и том же джава рантайме. Когда я начну делать интерпретацию, ситуация сразу изменится и придется думать, что делать.

4. Да, способ есть. c.macroApplication.

Вообще, наше обсуждение это часть большого редизайна нашей макросистемы, которым я сейчас занимаюсь. Если вам будет интересно, я расшарю первую версию дизайн-документа, когда она будет готова для прочтения кем-нибудь кроме меня (сейчас там еще во многих местах полнейший хаос).
(Reply) (Parent) (Thread)
From:Valentin Budaev
Date:September 3rd, 2013 08:59 am (UTC)
(Link)
> Синтетические деревья, которым позиция не сопоставлена, получают позицию макро вызова, который сейчас раскрывается.

Ага, это хорошо.

> Не знаю, как это делается в Схеме

В схеме оно just works. Экспандер раскрывает форму -> смотрит не является ли оно define-syntax, если является - вычисляет в +1 фазе тело и добавляет в лексический контекст информацию о том, что с соответствующим идентификатором связан макространсформер. И дальше при раскрытии если этот сгенеренный макрос встретится, то он уже будет раскрываться, т.к. добавлен в контекст.

> я планирую это сделать через интерпретацию деревьев.

Это как? В смысле, что вообще под этим подразумевается?

> Вообще, наше обсуждение это часть большого редизайна нашей макросистемы, которым я сейчас занимаюсь. Если вам будет интересно, я расшарю первую версию дизайн-документа, когда она будет готова для прочтения кем-нибудь кроме меня (сейчас там еще во многих местах полнейший хаос).

О, мне очень интересно будет :)
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 3rd, 2013 11:52 am (UTC)
(Link)
> "вычисляет в +1 фазе тело"
Ага, именно это я и хочу реализовать через интерпретацию.
(Reply) (Parent) (Thread)