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: