3

ラケットでのコマンドライン処理について、私は理解していませんか? たとえば、最初の引数を foo.html として処理したいだけです。コマンドラインから次のように実行します。

racket cmd.rkt foo.html

残念ながら、それは単に返されます:

foo.html'#(#<void>)

cmd.rkt のコードは次のとおりです。

(for/vector ([i (current-command-line-arguments)])
    (display i))
4

2 に答える 2

4

for/vectorベクトルを繰り返し処理するためと呼ばれるのではなく、本体式の結果をベクトルに蓄積するため、そう呼ばれます。そのため、コマンドライン引数ごとにdisplay呼び出しを評価し、引数を出力して を返し#<void>、結果を void 値のベクトルに蓄積します。

for代わりに使用すると、問題は解決します。

于 2013-08-06T21:33:29.407 に答える
3

コードが何をしているのか見てみましょう。このコマンドで...

racket cmd.rkt foo.html

... インタープリターに伝えています: 実行cmd.rktして、単一のパラメーター、 string を渡します"foo.html"

スクリプトでは、このコード...

(for/vector ([i (current-command-line-arguments)])
    (display i))

...コマンド ライン引数 (例では 1 つ) を反復処理し、それぞれを順番に表示します。値として戻り、反復でdisplay返されたすべての値を含むベクトルを作成することに注意してください。当然、これが出力になります。#<void>for/vector

foo.html'#(#<void>)

最初の部分foo.htmlは、渡された単一のコマンド ライン引数を表示した結果です。2 番目の部分は、前述のように、 を呼び出した結果で'#(#<void>)ある 1 つの要素を持つベクトルです。#<void>display

最後に、他の回答で述べたように、受信したすべてのコマンドライン引数を出力することだけを意図している場合は、使用を避けてくださいfor/vector-新しいベクトルを作成したくない場合は、引数と単純なfor意志のみをトラバースして出力します十分です。これは機能するはずであり、次の使用に関する @GregHendershott の推奨される最適化が含まれていますin-vector

(for ([i (in-vector (current-command-line-arguments))])
    (display i))
于 2013-08-06T21:36:47.020 に答える