除了Racket要求的require
头文件外,break-example.rkt仅是许多示例中的一个,因此它是一个完全有效的Java程序。
例如如果我已经用Racket作为Racket模块语言编写了Java解释器/编译器,我怎么能这样说:“ Main.java
这个文件mini-java
是用模块语言{{1}}编写的,但是没有”没有任何特定于球拍的标头”?
(请注意,我对Racket的实践经验几乎为零。我正在针对Racket + DrRacket的特定用例进行评估,这与Java无关。我搜索了文档,但无法找到任何方法来实现这一目标。)
答案 0 :(得分:1)
我现在无法运行或测试,但是也许您可以从这里开始并进行试验。它使用的主要内容是include/reader
:
#lang racket
(require racket/include
syntax/parse/define
(for-syntax racket/syntax
racket/port
syntax/modread))
(define-simple-macro (require/mini-java path)
#:with modname (generate-temporary #'path)
(begin
(include/reader path (mini-java-reader 'modname))
(require 'modname)))
(begin-for-syntax
;; Symbol -> [Any InputPort -> Syntax]
(define ((mini-java-reader modname) src input)
(cond
[(port-closed? input) eof]
[else
(define stx
(with-module-reading-parameterization
(lambda ()
(read-syntax src
(input-port-append #t
(open-input-string "#lang mini-java\n")
input)))))
(close-input-port input)
(syntax-parse stx
[(module _ l . b)
#`(module #,modname l . b)])])))