Как «потребовать» модуль Racket, у которого нет строки заголовка #lang? - PullRequest
1 голос
/ 18 мая 2019

В качестве одного из многих возможных примеров, break-example.rkt будет вполне допустимой Java-программой, за исключением заголовка #lang mini-java, который требуется для Racket.

Так, например если я написал интерпретатор / компилятор Java в Racket в качестве языка модуля Racket, то как я могу сказать: «require этот файл Main.java, который написан на языке модуля mini-java, но не имеет специфичного для Racket заголовок "?

(Обратите внимание, что у меня практически нулевой практический опыт работы с Racket. Я оцениваю это для конкретного случая использования Racket + DrRacket, который, кстати, не имеет ничего общего с Java. Я искал документацию, но не мог найти способ добиться этого.)

1 Ответ

1 голос
/ 18 мая 2019

Я не могу запустить или проверить это прямо сейчас, но, возможно, вы можете начать отсюда и поэкспериментировать с этим.Главное, что он использует: 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)])])))
...