?

Log in

No account? Create an account

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

Aug. 27th, 2013

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

Previous Entry Share Next Entry

Comments:

[User Picture]
From:xeno_by
Date:August 28th, 2013 06:13 am (UTC)
(Link)
В Немерле есть интересный хак. Локальные переменные в квазицитатах не запоминают свой лексический контекст:
  import Bar;
  def d1 = <[ def x = y + foo(4) ]>;
  def d2 = <[ def y = $(Bar.Compute(): int) ]>;
  <[ 
    $d2;
    def foo(x) { x + 1 }; 
    $d1;
    x * 2 
  ]>
Насколько я понимаю, Bar тут прибиндится к заимпортированному имени, а вот y и foo нарушат ссылочную прозрачность, т.е. даже если перед def d1 = ... определить def y = 100500, это ничего не изменит.
(Reply) (Parent) (Thread)
From:Valentin Budaev
Date:August 28th, 2013 11:37 am (UTC)
(Link)
В scheme есть вообще разные подходы, к тому, когда случается clash переменных в разных квазицитатах. Первый - когда все переменные с одним именем, сгенеренные в рамках одного трансформера, "одинаковы", то есть (define x-arg #'x) #`(let ([x 1]) #,x-arg) - работает (если эти формы в одном макросе идут), а второй - когда они разные, то есть в описанном случае будет unbound variable, и связать вводимую квазицитатой переменную можно только в той же квазицитате (если не обойти гигиену руками, конечно). Обычно используется первый - он, в общем, удобнее. Второй более безопасен. Но я, кстати, даже не припомню, где использовался второй.

Edited at 2013-08-28 11:37 am (UTC)
(Reply) (Parent) (Thread)