?

Log in

No account? Create an account

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

Aug. 27th, 2013

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

Previous Entry Share Next Entry

Comments:

From:Valentin Budaev
Date:August 29th, 2013 10:00 am (UTC)
(Link)
Вообще, выдернуть такую квазицитату вовне - это уже весьма нетривиальная задача:


(define-for-syntax x-var #f)

(define-syntax (set-var! stx)
(syntax-case stx ()
[(_ var) (begin (set! x-var (syntax-local-introduce #'var))
#'(void))]))

(define-syntax (get-var stx)
(syntax-local-introduce x-var))

(let ([x 1])
(set-var! x))

(let ([x 2])
(get-var))

ошибка: x: identifier used out of context in: x
при этом с марками все в порядке - то есть х который приходит из (get-var) марок не имеет.

И это логично вобщем-то - за пределами ее лексического контекста локальной переменной не существует.

Можно, вообще говоря, имея этот х собрать специально для него лет-форму, но зачем?

Edited at 2013-08-29 10:02 am (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:August 29th, 2013 03:36 pm (UTC)
(Link)
Познавательный эксперимент, спасибо!

Я скорее имел ввиду вот это:
{
  val x = 2
  @forSyntax val qq = q"x"
  macro foo = qq
  foo
}
Как я понимаю, этот пример работать будет, так?

Edited at 2013-08-29 03:38 pm (UTC)
(Reply) (Parent) (Thread)
From:Valentin Budaev
Date:August 29th, 2013 04:25 pm (UTC)
(Link)
Будет, тут никакой проблемы нету. Контекст один - все, что внутри {}, ничего ниоткуда не выносится и все ок.

ЗЫ: как вставлять код, чтобы отступы не бились? А то лиспокод без отступов... ну... :)
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:August 29th, 2013 11:53 pm (UTC)
(Link)
Я использую
<code><pre>...</pre></code>


Edited at 2013-08-29 11:54 pm (UTC)
(Reply) (Parent) (Thread)