2010-11-08 4 views
2

Макросы схемы, по крайней мере, разновидность синтаксиса, говорят, что можно произвольно вычислять код для кода. Однако (как в общем случае, так и в конкретном случае, который я сейчас просматриваю) это требует, чтобы вычисление указывалось в терминах рекурсивных функций. Когда я пробую различные варианты этого, я получаю, например.Произвольные вычисления в макросе схемы

main.scm: 32: 71: компиляции: несвязанный идентификатор в модуле (в трансформаторной среде, которая не включает в себя определение времени выполнения) в: развернуть-вары

(реализация является Ракетка, если это важно.)

Похоже, что вы не можете определить именованные функции до тех пор, пока не будет выполнена макросъемка.

Я полагаю, я мог бы прибегнуть к комбинатору Y, но я полагаю, что стоит сначала спросить, есть ли лучший подход?

ответ

5

Да, факт, что вы используете проблемы с ракеткой - в Racket есть что-то, что называется разделением фаз, что означает, что уровень синтаксиса не может использовать функции времени выполнения. Например, это:

#lang racket 
(define (bleh) #'123) 
(define-syntax (foo stx) 
    (bleh)) 
(foo) 

не будет работать, так как bleh связан на время выполнения, а не для синтаксиса. Вместо этого, он должен быть

(define-for-syntax (bleh) #'123) 

или

(begin-for-syntax (define (bleh) #'123)) 

или перемещен как внутреннее определение в теле макроса, или перемещен в собственный модуль и требует использования (require (for-syntax "bleh.rkt")).

Смежные вопросы