3 votes

Le traitement de la ligne de commande en Racket contient du void intégré

Qu'est-ce que je ne comprends pas dans le traitement de la ligne de commande en racket ? Par exemple, je veux juste traiter le premier argument comme foo.html. En ligne de commande, je l'exécute comme suit :

racket cmd.rkt foo.html

Malheureusement, ce n'est qu'un retour :

foo.html'#(#<void>)

Voici le code pour cmd.rkt :

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

4voto

jacobm Points 5703

for/vector ne s'appelle pas ainsi parce qu'il parcourt des vecteurs, mais parce qu'il accumule les résultats de l'expression de son corps dans un vecteur. Ainsi, pour chaque argument de la ligne de commande, il évalue l'expression display qui imprime l'argument et renvoie #<void> et accumule le résultat dans un vecteur de valeurs nulles.

Utilice for et le problème disparaîtra.

3voto

Óscar López Points 97105

Voyons ce que fait le code. Avec cette commande...

racket cmd.rkt foo.html

... Vous dites à l'interpréteur : exécutez cmd.rkt et transmet un seul paramètre, la chaîne de caractères "foo.html" .

Dans le script, ce code...

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

...itère sur les arguments de la ligne de commande (un seul dans l'exemple), affichant chacun d'entre eux à tour de rôle. Remarquez que display retours #<void> comme valeur, et for/vector crée un vecteur avec toutes les valeurs retournées lors de l'itération, ce qui constitue naturellement la sortie :

foo.html'#(#<void>)

La première partie, foo.html est le résultat de l'affichage de l'unique argument de la ligne de commande qui a été transmis. La deuxième partie, '#(#<void>) est un vecteur à un seul élément, #<void> qui, comme indiqué précédemment, est le résultat de l'appel à display .

Enfin, comme cela a été mentionné dans les autres réponses : si vous avez seulement l'intention de imprimer tous les arguments de ligne de commande reçus, puis éviter d'utiliser for/vector - vous ne voulez pas créer un nouveau vecteur, mais seulement parcourir et imprimer les arguments et un simple for suffira. Cela devrait fonctionner, et inclut l'optimisation recommandée par @GregHendershott concernant l'utilisation de in-vector :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X