Информация о типе доступа в макросе в typed / racket

Как я могу получить доступ к типам членов структуры на typed/racket языке? Функция extract-struct-info выдает список методов доступа к полям, но не их типы.

(require (for-syntax racket/struct-info
                     syntax/parse))

(define-syntax (display-struct-info stx)
  (syntax-parse stx
    [(display-struct-info name:id)
     (display (extract-struct-info (syntax-local-value #'name)))
     #'(list)]))

(struct: s ([a : Number] [b : String]))

(display-struct-info s)

Выходы:

(.#<syntax:12:9 struct:s> .#<syntax make-s> .#<syntax:12:9 s?> (.#<syntax:12:9 s-b> .#<syntax:12:9 s-a>) (#f #f) #t)'()

В более общем плане, как я могу получить доступ к типизированным типам / типам рэкетов, например, получить список типов в тип объединения (U Number String 'foo 'bar) или просмотр аргументов полиморфный тип?

Меня интересует только доступ во время расширения макроса, не доступ во время выполнения.

Связано: Получить информацию о типе в макросах (тот же вопрос для Common Lisp)


person Suzanne Soy    schedule 21.04.2015    source источник


Ответы (2)


От авторитетных источников (разработчиков Typed Racket) [из irc-канала #racket на freenode]:

mithos28: ... the brief answer is that types are not available until after macro expansion
soegaard: Quoting: "I am interested only in macro-expansion-time access, not run-time access."
soegaard: So only after - or also during?
mithos28: only after. #%module-begin from TR does an local expand of the body and then once that returns traverses it and checks types and generates contracts/optimizes
person soegaard    schedule 21.04.2015

Теперь возможен новый ответ, но с использованием альтернативы Typed / Racket: _1 _ Библиотека Racket позволяет создавать типизированные языки, на которых тип, связанный с выражением, может быть доступен во время компиляции.

К сожалению, я не знаю turnstile достаточно (пока?), Чтобы привести подробный пример.

person Suzanne Soy    schedule 06.01.2017