Разбираюсь с макросистемой racket'a. Пишу
SQL-образный DSL
Хочу проверять поля в where-clause на наличие у сущности, для которой делается запрос. И делать это на этапе компиляции.
Сейчас сущность объявляется как
(define-entity user
user_table (id name))
Что разворачивается в
(define entity
(hash 'table 'user_table
'fields '(id name)))
И проверка работает только в runtime.
Т.е. при попытке обратится из syntax-case приводит к
reference to an identifier before its definition: user phase: 1 (which cannot access the run-time definition)
Как бы выйти из этой ситуации?
Использовать для определения сущности define-for-syntax?
Здравствуйте, Danila_a, Вы писали:
D_>Использовать для определения сущности define-for-syntax?
Я думаю, к этому времени (три дня прошло) Вы уже нашли ответ.
Тем не менее (хотя бы для тех, кто наткнётся на эту тему) — Вы правы: да, банальная замена
#'(define entity (hash 'table 'table* 'fields 'fields*))
на
#'(define-for-syntax entity (hash 'table 'table* 'fields 'fields*))
будет работать
Да, действительно, решение уже нашел(использовал то, что сам и предлагал

Просто хотел убедится, что мыслю в нужном направлении.
Поэтому спасибо Вам за ответ)
Здравствуйте, Alexey F, Вы писали:
AF>Здравствуйте, Danila_a, Вы писали:
D_>>Использовать для определения сущности define-for-syntax?
AF>Я думаю, к этому времени (три дня прошло) Вы уже нашли ответ.
AF>Тем не менее (хотя бы для тех, кто наткнётся на эту тему) — Вы правы: да, банальная замена
AF>AF>#'(define entity (hash 'table 'table* 'fields 'fields*))
AF>
AF>на
AF>AF>#'(define-for-syntax entity (hash 'table 'table* 'fields 'fields*))
AF>
AF>будет работать