2 votes

Pourquoi, lorsque j'utilise printf, le programme n'envoie pas de chaîne en sortie, alors que lorsque j'utilise println, c'est le cas ?

Avoir une fonction simple en Clojure

(defn command []
 (loop []
 (let [input (read-line)
    string-tokens (string/split input #" ")
    tokens (map keyword string-tokens)
    cmd (first tokens)]
  (cond
   ;; explain the commands
   (= cmd :help)(do
                  (printf "Usage:\nsearch <term>\nquit\n")
                  (recur)
                  )
   ;; break the loop
   (= cmd :quit) (printf "bye bye")
   ;; do something
   (= cmd :search) (do
                    (printf "Searching for %s...\n" (rest string-tokens))
                    (recur))
   ;; handle unknown input
   :else (do
          (println "Huh?")
          (recur))
 )
))

)

lorsque j'utilise println pour envoyer une chaîne à la sortie, cela fonctionne bien, mais lorsque j'utilise 'printf`, il semble que la chaîne soit conservée dans le tampon et imprimée lorsque je quitte le programme en choisissant l'option :quit.

Je pense que cela a quelque chose à voir avec do et la récursivité, mais sans cela, je ne peux pas utiliser le recur car je reçois l'erreur "can only recur from tail position".

EDIT : Ce n'est pas que mon programme ne fonctionne pas. J'ai trouvé le moyen d'obvier au problème en utilisant d'abord format et ensuite println (ex. (println (format "Searching for %s...\n" (rest string-tokens))) ), mais un tel comportement me paraît bizarre.

2voto

leetwinski Points 10333

Parce que println appels flush tandis que la fonction printf ne. Ainsi, si vous ajoutez (flush) après chaque printf il fonctionnera.

(printf "Usage:\nsearch <term>\nquit\n")
(flush)
(recur)

Je vous propose de réécrire l'ensemble de la fonction de la manière suivante :

(defn command []
  (loop []
    (let [input (read-line)
          string-tokens (clojure.string/split input #" ")
          cmd (keyword (first string-tokens))
          reply (case cmd
                  :help "Usage:\nsearch <term>\nquit"
                  :quit "bye bye"
                  :search (format "Searching for %s..." (rest string-tokens))
                  "Huh?")]
      (println reply)
      (when-not (= :quit cmd)
        (recur)))))

vous pouvez ainsi séparer la logique de sélection des réponses de la sortie de la fonction et de la logique de récursion/terminaison. en prime, vous évitez les répétitions et améliorez la lisibilité (enfin, imo).

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