我想在Racket中建立一个自定义的语言,需要重新定义隐含的形式。#%app
. 然而,使用宏步进器,我注意到,与常规的"proc-id
"函数application,struct-id application不会被替换成自定义的 #%app
形式。为什么会出现这种情况?
我猜测你在宏程序中看到的是由于以下事实造成的(除非你用关键字选项指定了其他内容 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))