Почему я не могу настроить приложение функции построения struct-id? - PullRequest
0 голосов
/ 04 мая 2020

Я хотел бы создать собственный язык в Racket, который требует переопределения неявной формы #%app. Однако, используя макрос степпер, я заметил, что в отличие от обычного приложения-функции "proc-id", приложение struct-id не заменяется пользовательской формой #%app. Почему это так?

1 Ответ

1 голос
/ 04 мая 2020

Я предполагаю, что то, что вы видите в макросе степпера, является результатом того факта, что (если вы не укажете иное с опциями ключевого слова) 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))
...