Вопрос: Обработка командной строки в Racket содержит встроенную void


Как насчет обработки командной строки в racket я не понимаю? Например, я просто хочу обработать первый аргумент как foo.html. Из командной строки я запускаю ее как:

racket cmd.rkt foo.html

К сожалению, это просто возвращает:

foo.html'#(#<void>)

Вот код для cmd.rkt:

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

3


источник


Ответы:


for/vector не называется тем, что, поскольку он итерации по векторам, он называется так потому, что он накапливает результаты своего выражения тела в вектор. Поэтому для каждого аргумента командной строки он вычисляет display вызов, который печатает аргумент и возвращает #<void>, и накапливает результат в вектор значений void.

использование for вместо этого проблема исчезнет.


4



Посмотрим, что делает код. С помощью этой команды ...

racket cmd.rkt foo.html

... Вы говорите переводчику: запустите cmd.rkt и передать один параметр, строка "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))

3