首页 > 解决方案 > 为什么我不能自定义一个struct-id构造函数的应用?

问题描述

我想在 Racket 中构建一种需要重新定义隐式形式的自定义语言#%app。但是,使用宏步进器时,我注意到与常规的“ proc-id”函数应用程序不同,struct-id 应用程序不会被自定义#%app表单替换。为什么会这样?

标签: macrosracketexpansion

解决方案


我的猜测是,您在宏步进器中看到的结果是(除非您使用关键字选项另外指定)struct将结构名称绑定到宏以传达有关结构类型的静态信息,该信息由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的工件:#%appbag

; (bag1 groceries)
(bag '(oranges milk salsa))

推荐阅读