macros - 为什么我不能自定义一个struct-id构造函数的应用?
问题描述
我想在 Racket 中构建一种需要重新定义隐式形式的自定义语言#%app
。但是,使用宏步进器时,我注意到与常规的“ proc-id
”函数应用程序不同,struct-id 应用程序不会被自定义#%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))
推荐阅读
- swift - Swift Firebase 防止用户多次投票并显示平均评分
- javascript - 当用户滚动到部分时,修复了页面顶部部分的标题 div
- python - 如何在这组代码中包含def函数(分析单词出现频率)
- c# - 如何使用 Environment.SpecialFolder 在我的 Xamarin/VisualStudio 项目中指定特定文件?
- sharepoint-online - 用于 SP Online 的 SharePoint Designer 2013 工作流查找
- c++ - 减少复制构造函数调用
- android - Debug Android 配置突然停止工作
- r - 为什么 R 在使用 inside of with 语句时需要在 {} 内返回?
- javascript - Javascript .innerHTML 函数输出只闪烁
- excel - 如何计算行号直到找到一个值,并在值出现时动态地改变计数