Игрушечный SQL-образный DSL
От: Danila_a Россия http://ib-soft.ru
Дата: 01.02.12 15:53
Оценка:
Разбираюсь с макросистемой 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?
racket scheme
Re: Игрушечный SQL-образный DSL
От: Alexey F  
Дата: 04.02.12 10:05
Оценка:
Здравствуйте, Danila_a, Вы писали:

D_>Использовать для определения сущности define-for-syntax?

Я думаю, к этому времени (три дня прошло) Вы уже нашли ответ.
Тем не менее (хотя бы для тех, кто наткнётся на эту тему) — Вы правы: да, банальная замена
#'(define entity (hash 'table 'table* 'fields 'fields*))

на
#'(define-for-syntax entity (hash 'table 'table* 'fields 'fields*))

будет работать
Re[2]: Игрушечный SQL-образный DSL
От: Danila_a Россия http://ib-soft.ru
Дата: 05.02.12 13:15
Оценка:
Да, действительно, решение уже нашел(использовал то, что сам и предлагал
Просто хотел убедится, что мыслю в нужном направлении.
Поэтому спасибо Вам за ответ)

Здравствуйте, 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>будет работать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.