Произвольные вычисления в макросе схемы - PullRequest
2 голосов
/ 08 ноября 2010

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

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

(Реализация - Racket, если это имеет значение.)

В результате получается, что вы не можете определить именованные функции до тех пор, пока не обработаете макрос.Предположим, я мог бы прибегнуть к комбинатору Y, но я полагаю, что сначала стоит спросить, есть ли лучший подход?

1 Ответ

7 голосов
/ 08 ноября 2010

Да, тот факт, что вы используете Racket, имеет значение - в 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")).

...