Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Pq o println está saindo nesta ordem?

Tenho um código ligeiramente diferente da Aula 5, Clojure: Schemas. Meu código funciona, mas a minha dúvida está no final dele.

Nas 2 últimas linhas eu faço dois println. O primeiro println é o de Pacientes e o segundo é o de Visitas. Porém, os prints no terminal aparecem na ordem oposta (visitas primeiro e depois pacientes). Pq isso ocorre?

Código completo:

(ns clojure-schemas.aula5
  (:use clojure.pprint)
  (:require [schema.core :as s]))

(s/set-fn-validation! true)

(def PosInt (s/pred pos-int?))
(def Plano [s/Keyword])

(def Paciente
  {:id PosInt,
   :nome s/Str,
   :plano Plano
   (s/optional-key :nascimento) s/Str})

(s/defn novo-paciente :- Paciente
        [id :- PosInt,
         nome :- s/Str]
        {:id id, :nome nome, :plano []})

(def Pacientes {PosInt Paciente})

(def Visitas {PosInt [s/Str]})

(s/defn adiciona-paciente :- Pacientes
  [pacientes :- Pacientes, paciente :- Paciente]
  (if-let [id (:id paciente)]
    (assoc pacientes id paciente)
    (throw (ex-info "Paciente não possui id" paciente))))

(s/defn adiciona-visita :- Visitas
        [visitas :- Visitas, paciente-id :- PosInt, novas-visistas :- [s/Str]]
        (if (contains? visitas paciente-id)
          (update visitas paciente-id concat novas-visistas)
          (assoc visitas paciente-id novas-visistas)))

(s/defn imprime-relatorio
        [visistas :- Visitas, paciente :- Paciente]
        (println "Visitas do paciente" (:id paciente) "são" (get visistas (:id paciente))))

(let [guilherme (novo-paciente 15, "Guilherme")
      daniela (novo-paciente 20 "Daniela")
      paulo (novo-paciente 25 "Paulo")

      pacientes (reduce adiciona-paciente {} [guilherme, daniela, paulo])

      visitas {}
      visitas (adiciona-visita visitas 15 ["01/01/2019"])
      visitas (adiciona-visita visitas 20 ["01/01/2019", "01/01/2020"])
      visitas (adiciona-visita visitas 15 ["01/01/2021"])]

  (println "Pacientes" pacientes)
  (println "Visistas " visitas))

Screenshot do terminal:

Screenshot de um terminal Clojure REPL demonstrando o resultado de 2 comandos println, sendo o primeiro uma lista de Visitas e o segundo uma lista de Pacientes

1 resposta
solução!

Ola,

A razão pela qual o println está invertendo a ordem dos prints no terminal está relacionada ao comportamento do stream de saída do Clojure (ou JVM). O println escreve para o System.out, que é um fluxo bufferizado. Quando várias chamadas println são feitas, o conteúdo pode ser exibido de

forma que a saída ocorra em uma ordem inesperada devido ao tempo de flush desse buffer.

Neste caso, o print de "Visitas" está sendo exibido primeiro porque o buffer de saída do println foi descarregado antes do println de "Pacientes". Para resolver, você pode forçar a saída com:

(println "Pacientes" pacientes)
(.flush *out*) ; Força o flush do buffer
(println "Visitas" visitas)

Valeu!