私は Racket にモジュール meta-language を書き込もうとしてmylang
います。これは、次のように、変更された本体を渡す第 2 言語を受け入れます。
(module foo mylang typed/racket body)
次と同等です。
(module foo typed/racket transformed-body)
もちろん、そのtyped/racket
部分は他のモジュール言語に置き換えることができます。
本体はそのままの簡易版にしてみました。コマンドラインでは問題なく動作しますが、DrRacket で実行すると次のエラーが発生します。
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/typecheck/tc-toplevel.rkt:479:30: require: namespace mismatch;
reference to a module that is not available
reference phase: 1
referenced module: "/usr/share/racket/pkgs/typed-racket-lib/typed-racket/env/env-req.rkt"
referenced phase level: 0 in: add-mod!
コード全体は次のとおりです。
#lang racket
(module mylang racket
(provide (rename-out [-#%module-begin #%module-begin]))
(require (for-syntax syntax/strip-context))
(define-syntax (-#%module-begin stx)
(syntax-case stx ()
[(_ lng . rest)
(let ([lng-sym (syntax-e #'lng)])
(namespace-require `(for-meta -1 ,lng-sym))
(with-syntax ([mb (namespace-symbol->identifier '#%module-begin)])
#`(mb . #,(replace-context #'mb #'rest))))])))
(module foo (submod ".." mylang) typed/racket/base
(ann (+ 1) Number))
(require 'foo)
要件(つまり、避けたいソリューション):
(require (only-in typed/racket))
モジュール内にa を追加するとこの作業が行われますが、 at alについて知る必要がないmylang
一般的な解決策に興味があります(つまり、誰かが新しい言語を追加した場合、箱から出してそれを使用する必要があります)。mylang
typed/racket
foo
mylang
また、ここで行われているように、サブモジュールを宣言してすぐ
require
に再実行するトリックには興味がありません。これは、実際のモジュールへのパスが変更されるためです (たとえば、特別な動作が失われるため) 。provide
main
test
サブモジュールがより多くの回数アクセスおよび/またはインスタンス化されるため、コンパイル時も遅くなります(これは を書くことで確認でき
(begin-for-syntax (displayln 'here))
、大規模なプログラムに顕著な影響を与えtyped/racket
ます.DrRacket の矢印が委譲先言語によって提供されるビルトインで機能する場合、
ann
ボーナスポイント。+
Number
typed/racket/base