Syntax 对不同文件中的语法定义使用相同的begin
我在一个更大的代码中,我需要这样做: 文件\u 1.rkt:Syntax 对不同文件中的语法定义使用相同的begin,syntax,racket,Syntax,Racket,我在一个更大的代码中,我需要这样做: 文件\u 1.rkt: #朗球拍 (提供定义类型ref) (需要语法/解析/定义) (从语法开始 (定义类型(生成hasheq))) (定义语法分析器定义类型 [(id类型) (散列集!类型(语法->数据#'id)(语法->数据#'type)) #“(无效)]) (定义语法分析器类型参考 [(id) (writeln(散列引用类型(语法->数据#'id))) #“(无效)]) 文件_2.rkt: #朗球拍 (提供(所有已定义) (需要“文件_1.rkt”)
#朗球拍
(提供定义类型ref)
(需要语法/解析/定义)
(从语法开始
(定义类型(生成hasheq)))
(定义语法分析器定义类型
[(id类型)
(散列集!类型(语法->数据#'id)(语法->数据#'type))
#“(无效)])
(定义语法分析器类型参考
[(id)
(writeln(散列引用类型(语法->数据#'id)))
#“(无效)])
文件_2.rkt:
#朗球拍
(提供(所有已定义)
(需要“文件_1.rkt”)
(定义类型原子符号)
(类型参考原子)
输出:
符号
文件\u 3.rkt:
#朗球拍
(需要“文件1.rkt”或“文件2.rkt”)
(类型参考原子)
输出:
;哈希引用:找不到键的值
; 关键:原子
; 上下文(普通;要查看更好的errortrace上下文,请使用C-u前缀重新运行):
; /Applications/racketv8.0/collects/syntax/parse/define.rkt:20:4
; /Applications/racketv8.0/collects/syntax/wrap modbeg.rkt:46:4
; /...
似乎对于每个语法扩展类型
都会再次实例化
我需要为不同的文件共享相同的
类型
。我能做什么?您真的需要将信息存储在这样的哈希表中吗?一种更简单的方法是在定义类型中实际定义id
,这样您就可以正确地提供它,而其他模块也可以正确地要求它
看起来您希望define type
在编译时出现,因此可以使用define syntax
创建绑定,并使用syntax local value
引用它
#lang racket
(provide define-type types-ref)
(require syntax/parse/define)
(define-syntax-parser define-type
[(_ id type)
#'(define-syntax id (quote type))])
(define-syntax-parser types-ref
[(_ id)
(writeln (syntax-local-value #'id))
#'(void)])