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))

...正在迭代命令行参数(示例中为单个参数),依次显示每个参数。请注意display返回#<void>作为它的值,并for/vector在迭代中创建一个包含所有返回值的向量,所以自然这是输出:

foo.html'#(#<void>)

第一部分foo.html是显示传递的单个命令行参数的结果。第二部分'#(#<void>)是具有单个元素的向量,#<void>如前所述,它是调用的结果display

最后,正如其他答案中提到的那样:如果您只想打印所有收到的命令行参数,则避免使用for/vector- 您不想创建新向量,只遍历并打印参数和一个简单的for意志够了。这应该可以工作,并且包括@GregHendershott 推荐的关于使用的优化in-vector

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