まず、コードには#%module-begin
削除可能な冗長性があります。
#lang
いくつかのことを行います.1つは、最初にインポートされたバインディングのセットを決定することによってファイルのセマンティクスを制御することです。これは、module
フォームが登場する前に行っ#lang
たことです。サブモジュールによりmodule
、ファイルの一部にも使用できるようになりました。ただし、#lang
ファイルを解析するリーダーを特定することもできますが、サブモジュールでは実行できない#lang
ため、ファイル全体のパーサーを設定するトップレベルは 1 つだけです。
(補足: これには技術的な理由があります。#lang
リーダーは値に達するまでファイルの残りを読み取るeof
ため、ネストされ
たファイルの末尾を取得する前に値を取得するか、新しい種類の eof のようなものを追加する#lang
必要があります。eof
つまり、変更は慎重に行う必要があるということです -- もちろん可能ですが、その必要性は十分に出てきませんでした. うまくいけば、将来的にはそうなるでしょう.)
しかし、あなたの場合、完全に新しい具体的な構文は必要ありません。s 式の拡張だけであり、通常のコードへの影響を最小限に抑えるために選択された拡張です。したがって、ほとんどの場合、ファイル全体で @-form 構文を有効にしてから、必要な場所で @-forms を使用するだけで問題ありません。これは単に sexprs を読み取る別の方法であるため、 を使用することもでき、 をmodule
使用する必要のないこのコードにつながります#reader
。
#lang at-exp racket/base
@module[x scribble/text/lang]{
hi
@(+ 1 456)
}
(require 'x)
ここで少し奇妙なことの 1 つは、scribble/text/lang
だけでなく、 を使用していることですscribble/text
。通常、リーダーでコードを読み取った後#lang foo
とまったく同じ
です。しかし、言語の場合、別の違いがあります。それを として使用すると、モジュール本体のセマンティクスが「それぞれを出力する」ようになります。考え方としては、言語としては大部分がテキスト ファイルを出力したいが、ライブラリとしてはコードを記述して自分で印刷したいというものです。(module x foo ...)
foo
scribble/text
#lang
このコードはmodule
を使用しているため、 を使用scribble/text
すると、すべてを吐き出す機能が得られないことを意味します。そのため、明示的に に切り替える必要がありますscribble/text/lang
。しかし、代わりに、言語の を使用して自分で吐き出すこともできoutput
ます。これにより、次のコードが得られます。
#lang at-exp racket/base
(module x racket/base
(require scribble/text)
(output @list{
hi
@(+ 1 456)}))
(require 'x)
scribble/text
はここでは言語として使用されていないことに注意してください。これは、( の外で#lang
) 使用したときに 1 つになるのに十分なものを提供しないためです。(あなたが見つけたものは、その冗長性につながります#%module-begin
...)
このバージョンは少し冗長ですが、コードの一部に使用するとライブラリとして使用することになるため、あなたのケースではより理にかなっていると思います。
@
最後に、構文を使用してファイル全体を読み取りたくない場合は、いくつかの部分のみを読み取り#reader
ます。見つかった はまったく問題ありません。(そして、これはリストを連結された出力として扱うことで簡単scribble/text
になるため、テキストのチャンクごとに 1 つのラッパーだけが必要です。)