为什么我不能自定义应用struct-id构造函数?

问题描述 投票:0回答:1

我想在Racket中建立一个自定义的语言,需要重新定义隐含的形式。#%app. 然而,使用宏步进器,我注意到,与常规的"proc-id"函数application,struct-id application不会被替换成自定义的 #%app 形式。为什么会出现这种情况?

macros racket expansion
1个回答
1
投票

我猜测你在宏程序中看到的是由于以下事实造成的(除非你用关键字选项指定了其他内容 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 属于 #%app 扩充后的 bag 宏。

; (bag1 groceries)
(bag '(oranges milk salsa))
© www.soinside.com 2019 - 2024. All rights reserved.