Ракетка: извлечение идентификаторов полей из конструкций - PullRequest
3 голосов
/ 31 мая 2010

Я хочу посмотреть, смогу ли я сопоставить поля структуры Racket со столбцами в БД.

Я выяснил, как извлечь функции доступа из структур в схеме PLT, используя четвертое возвращаемое значение:

(struct-type-info)

Однако возвращаемая процедура индексирует в структуре, используя целое число. Есть ли способ, которым я могу узнать, какие имена полей были в точке определения? Глядя на документацию, кажется, что эта информация «забыта» после того, как структура определена и существует только через функции созданного средства доступа: (<id>-<field-id> s).

Итак, я могу придумать два возможных решения:

  1. Поиск в символах пространства имен тех, которые начинаются с моего имени структуры (yuk);
  2. Определить пользовательский макрос define-struct, который фиксирует упорядоченную последовательность имен полей внутри некоторого хэша, который определяется по имени структуры (eek).

Ответы [ 2 ]

3 голосов
/ 31 мая 2010

Я думаю, что что-то вроде 2. является правильным подходом (define-struct имеет МНОЖЕСТВО ручек, и многие не имеют для этого смысла), но вместо того, чтобы создавать хэш, просто заставьте свой макрос расширяться до функций, которые манипулировать базой данных напрямую. И библиотека синтаксиса / структуры может помочь вам выполнить анализ формы define-struct.

2 голосов
/ 31 мая 2010

Ответ зависит от того, что вы хотите сделать с этой информацией. Дело в том, что он не хранится во время выполнения - это как привязки в функциях, которые не существуют во время выполнения. Но они существуют на уровне синтаксиса (= время компиляции). Например, этот глупый пример покажет вам значение, которое хранится на уровне синтаксиса, который содержит форму структуры:

> (define-struct foo (x y))
> (define-syntax x (begin (syntax-local-value #'foo) 1))
> (define-syntax x (begin (printf ">>> ~s\n" (syntax-local-value #'foo)) 1))
>>> #<checked-struct-info>

Конечно, он не показывает много, но это должно быть хорошим началом (вы можете посмотреть struct-info в документации и в коде). Но это может быть не то, что вы ищете, поскольку эта информация существует только на уровне синтаксиса. Если вы хотите что-то, что есть во время выполнения, то, возможно, вам лучше использовать списки или хэш-таблицы?

ОБНОВЛЕНИЕ (я слишком быстро просмотрел ваш вопрос):

Чтобы отобразить структуру в строку таблицы БД, вам нужно определить больше вещей: по крайней мере, удерживайте БД и поля, которые она обозначает, возможно, открытое соединение с БД для хранения значений или чтения значений из них. Так что, на мой взгляд, лучший способ сделать это с помощью макроса в любом случае - этот макрос расширится до использования define-struct со всем остальным, что вам нужно сохранить.

...