2
#lang racket/base
(module x scribble/text
 @(display 123))

#lang ステートメントはネストされたサブモジュールでは有効ではないようで、上記の拡張モジュール バージョンには何かが欠けています。

エラー: モジュール: モジュールの言語で #%module-begin バインディングがありません

アップデート:

これは多かれ少なかれ機能するように見えますが、より良い方法はありますか? scribble は、処理されていない出力ポートで何かを行いますか?

#lang racket/base
(module x scribble/text/lang
  (#%module-begin
   #reader scribble/reader @list{
     hi
     @(+ 1 456)
  }))
4

1 に答える 1

4

まず、コードには#%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 ...)fooscribble/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 つのラッパーだけが必要です。)

于 2015-06-29T08:40:10.240 に答える