2008-12-23 5 views
13

Alors que je barbote dans Clojure, j'ai écrit un programme très basique pour faire écho à tout ce que l'utilisateur tape dedans. Cependant, cela ne fonctionne pas d'une manière que je perçois comme naturelle. Voici le code:Clojure - Les effets secondaires se produisent en dehors de l'ordre

(defn goo [] 
    (print "echo> ") 
    (def resp (read-line)) 
    (print resp) 
) 

j'attendre le code à courir comme ça (pour moi en tapant foo comme l'entrée read-line):

user=> (goo) 
echo> foo 
foonil 

Mais au lieu, l'écho et lecture en ligne est commuté:

user=> (goo) 
foo 
echo> foonil 

Pourquoi cela se produit-il? Y a-t-il une subtilité qui me manque?

EDIT: De la réponse de Joe, la bonne solution est mise à jour:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (def resp (read-line)) 
    (print resp) 
    (flush) 
) 

En outre, les bouffées ne sont pas nécessaires si vous utilisez println au lieu de print.

Répondre

17

Je ne sais rien de clojure mais cela ressemble à un cas de tampons ne pas être rincé. Figure dehors comment rincer standard après l'impression. La fonction println se vide probablement à la fin de chaque ligne. Essayez:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (def resp (read-line)) 
    (print resp) 
) 
+0

qui l'a fait! Ajouter (flush) après les impressions l'a obtenu. Merci pour la réponse rapide! –

+2

Cool. Maintenant, j'ai une réponse vérifiée dans une langue que je ne connais pas. :-) Heureux d'avoir pu aider. – jmucchiello

+0

bonnes compétences! Par curiosité de quelqu'un qui connaît Clojure mais pas le fonctionnement interne des tampons stdout ... pourquoi ce problème se produit-il? Semble étrange que la commande peut être changé dans un tampon ..... – mikera

13

De même, n'utilisez pas "def" sauf si vous voulez réellement définir une variable globale. Utilisez "laisser" à la place:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (let [resp (read-line)] 
    (print resp) 
    (flush))) 

ou, plus court

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (print (read-line)) 
    (flush)) 
Questions connexes