我不明白球拍中的命令行处理怎么样?例如,我只想将第一个参数处理为 foo.html。从命令行我运行它:
racket cmd.rkt foo.html
不幸的是,这只是返回:
foo.html'#(#<void>)
这是 cmd.rkt 的代码:
(for/vector ([i (current-command-line-arguments)])
(display i))
我不明白球拍中的命令行处理怎么样?例如,我只想将第一个参数处理为 foo.html。从命令行我运行它:
racket cmd.rkt foo.html
不幸的是,这只是返回:
foo.html'#(#<void>)
这是 cmd.rkt 的代码:
(for/vector ([i (current-command-line-arguments)])
(display i))
for/vector
不是因为它迭代向量而被称为那个,而是因为它将它的身体表达的结果累积到一个向量中。因此,对于每个命令行参数,它都会评估display
调用,打印参数并返回#<void>
,并将结果累积到一个 void 值向量中。
改用for
,问题就会消失。
让我们看看代码在做什么。用这个命令...
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))