Я предполагаю, что то, что вы видите в макросе степпера, является результатом того факта, что (если вы не укажете иное с опциями ключевого слова) struct
привязывает имя структуры к макросу для передачи информации о состоянии c Тип структуры, который используется match
, shared
, struct-out
и другими макросами. При использовании в качестве выражения этот макрос расширяется до функции конструктора, которая связана с иначе недоступным именем. Если это не объясняет того, что вы видите, возможно, вы могли бы привести пример кода.
В любом случае, если вы отключите скрытие макросов, вы увидите, что прямое применение функции конструктора действительно использует правильная #%app
форма. Например, эта программа:
#lang racket
(module language racket
(provide (rename-out [my-app #%app])
(except-out (all-from-out racket)
#%app))
(define-syntax-rule (my-app rator rand ...)
(let ()
(print-app-form '(rator rand ...))
(rator rand ...)))
(define (print-app-form quoted)
(printf "; ~a\n" quoted)))
(module main (submod ".." language)
(struct bag (contents)
#:transparent)
(define groceries
'(oranges milk salsa))
(bag groceries))
печатает следующий вывод, где bag1
- это артефакт #%app
, расширяемый после макроса bag
:
; (bag1 groceries)
(bag '(oranges milk salsa))