如何“要求”没有#lang标头行的Racket模块?

时间:2019-05-18 08:34:46

标签: racket

除了Racket要求的require头文件外,break-example.rkt仅是许多示例中的一个,因此它是一个完全有效的Java程序。

例如如果我已经用Racket作为Racket模块语言编写了Java解释器/编译器,我怎么能这样说:“ Main.java这个文件mini-java是用模块语言{{1}}编写的,但是没有”没有任何特定于球拍的标头”?

(请注意,我对Racket的实践经验几乎为零。我正在针对Racket + DrRacket的特定用例进行评估,这与Java无关。我搜索了文档,但无法找到任何方法来实现这一目标。)

1 个答案:

答案 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)])])))