2012-03-08 1 views
1

J'utilise GNU CLISP et devient fou parce que ce programme:état Newline après avoir lu une ligne avec une invite ne semble pas être mis à jour

(read-line) 
(format t "~&<prompt RESPONSE") 

Sorties quelque chose comme:

my input... 
<prompt RESPONSE 

Mais si j'imprimer une invite avant (lecture en ligne) Je reçois une ligne fausse vide:

(format t "~&prompt> ") 
(read-line) 
(format t "~&<prompt RESPONSE") 

par exemple:

prompt> my input... 

<prompt RESPONSE 

J'ai essayé d'utiliser (finish-output) à la fois avant et après la ligne de lecture, mais cela n'a pas aidé. Je ne comprends pas d'où vient cette ligne vide. Je soupçonne qu'il y a un bug dans CLISP.

+0

Je ne peux pas reproduire le problème sous Linux Mint (dérivé Debian). Utilisez-vous CLISP sous Windows? –

+0

Merci d'avoir posé cette question! J'avais l'intention de taper une question similaire ... Spécifiquement demandant s'il y avait un moyen de rendre la nouvelle ligne conditionnelle au courant de l'entrée de l'utilisateur, parce que d'autres scénarios peuvent également faire ce Non ce que vous voulez ... – lindes

+0

@lindes je pourrais imaginer un scénario dans lequel vous ne savez pas à l'avance si l'entrée de l'utilisateur se termine par une nouvelle ligne, notamment dans les situations où vous acceptez une frappe à la fois. Le REPL ne fonctionne pas de cette façon. Il accepte une ligne d'entrée utilisateur à la fois, se terminant toujours par un saut de ligne. Note latérale: Si vous entrez plus d'une expression à la fois (c'est-à-dire, entrez-les toutes sur une ligne) dans le REPL, la sortie est mélangée, donc je suggère de ne pas le faire. –

Répondre

2

Pour ceux qui ne le savent pas, ~& dans une commande format est une nouvelle ligne conditionnelle, ce qui signifie "imprimer une nouvelle ligne si nécessaire". C'est-à-dire, n'imprimer un saut de ligne que si le dernier Lisp imprimé n'était pas déjà un saut de ligne.

La fonction format (au moins sur votre machine!) Ignore la saisie par l'utilisateur lorsqu'il décide d'émettre une nouvelle ligne. Cela peut ne pas être le cas sur tous les systèmes. Je ne me souviens vraiment pas.

Concentrons-nous sur le ~& qui précède immédiatement <prompt RESPONSE. Dans votre premier cas, format voit qu'il n'a encore rien imprimé et n'a donc pas besoin d'imprimer une nouvelle ligne. Dans le second cas, format voit que la dernière chose qu'il a imprimé n'était pas une nouvelle ligne et donc il a besoin d'imprimer une nouvelle ligne.

La solution: sachant que l'utilisateur fournira toujours le saut de ligne, ne l'incluez pas dans votre instruction format. Vous pouvez même le supprimer de votre première invite si vous le souhaitez: « Alors qu'est-ce ~& pour toute façon »

(format t "prompt> ") 
(read-line) 
(format t "<prompt RESPONSE") 

Alors, la question se pose, Et, en effet, il y a d'autres utilisations pour cela. Par exemple, pour séparer 2 lignes consécutives de sortie:

(format t "prompt> ") 
(read-line) 
(format t "<prompt RESPONSE 1~&<prompt RESPONSE 2") 
+0

La question qui me reste est de savoir si cela peut être fait pour être conscient du contenu d'entrée. Peut-il? Si c'est le cas, comment? – lindes

+0

Que voulez-vous faire avec l'entrée? Stockez-le dans une variable? –

+0

@lindes Je viens de lire votre autre commentaire, qui répond à mon commentaire précédent. –

Questions connexes