Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Unable to resolve jogo in this context

Fala galera, tudo bem?

Eu estava seguindo os exercícios dos vídeos do curso de clojure, ai quando chegou no passo em que lê teclado, e etc (Aula 04), eu não consigo mais executar o código através do repl.

Pelo que vi, o erro é:

> lein repl
#error {
 :cause Unable to resolve symbol: jogo in this context
 :via
 [{:type clojure.lang.Compiler$CompilerException
   :message Syntax error compiling at (forca/core.clj:22:5).
   :data #:clojure.error{:phase :compile-syntax-check, :line 22, :column 5, :source forca/core.clj}
   :at [clojure.lang.Compiler analyze Compiler.java 6808]}
  {:type java.lang.RuntimeException
   :message Unable to resolve symbol: jogo in this context
   :at [clojure.lang.Util runtimeException Util.java 221]}]
 :trace

Eu vi num outro post que daria pra colocar o require e o resolve, mas só gostaria de entender o que fiz / o que mudou pra precisar dele agora! ahha é que nas aulas anteriores o jogo estava funcionando bem..

Muito obrigado desde já!

(ns forca.core
  (:gen-class))

(def total-de-vidas 6)

(defn perdeu [] (print "Você perdeu"))
(defn ganhou [] (print "Você ganhou!"))

(defn letras-faltantes [palavra acertos]
  (remove (fn [letra] (contains? acertos (str letra))) palavra))

(defn acertou-a-palavra-toda? [palavra acertos]
  (empty? (letras-faltantes palavra acertos))
  )

(defn le-letra! [] (read-line))

(defn acertou? [chute palavra] (.contains palavra chute))

(defn avalia-chute [chute vidas palavra acertos]
  (if (acertou? chute palavra)
    (jogo vidas palavra (conj acertos chute))
    (jogo (dec vidas) palavra acertos)
    )

  )

(defn jogo [vidas palavra acertos]
  (if (= vidas 0)
    (perdeu)
    (if (acertou-a-palavra-toda? palavra acertos)
      (ganhou)
      (avalia-chute (le-letra!) vidas palavra acertos)
      )
    )
  )

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World!"))
2 respostas
solução!

Olá Felipe, Tudo bem?

O problema aparentemente é que a função jogo está sendo chamada na linha 22, mas só é declarada na linha, ao mover o bloco

(defn jogo [vidas palavra acertos]
  (if (= vidas 0)
    (perdeu)
    (if (acertou-a-palavra-toda? palavra acertos)
      (ganhou)
      (avalia-chute (le-letra!) vidas palavra acertos)
      )
    )
  )

antes do bloco

(defn avalia-chute [chute vidas palavra acertos]
  (if (acertou? chute palavra)
    (jogo vidas palavra (conj acertos chute))
    (jogo (dec vidas) palavra acertos)
    )
  )

Já resolve este problema, outra opção do Clojure é o declare que permite que você declare uma função antes de defini-la, podendo fazer o seguinte código:

(ns forca.core
  (:gen-class))

(def total-de-vidas 6)

(defn perdeu [] (print "Você perdeu"))
(defn ganhou [] (print "Você ganhou!"))

(defn letras-faltantes [palavra acertos]
  (remove (fn [letra] (contains? acertos (str letra))) palavra))

(defn acertou-a-palavra-toda? [palavra acertos]
  (empty? (letras-faltantes palavra acertos))
  )

(defn le-letra! [] (read-line))

(defn acertou? [chute palavra] (.contains palavra chute))

#_ Ao declarar jogo aqui a função avalia-chute não terá problemas ao usar o simbolo jogo.
(declare jogo)

(defn avalia-chute [chute vidas palavra acertos]
  (if (acertou? chute palavra)
    (jogo vidas palavra (conj acertos chute))
    (jogo (dec vidas) palavra acertos)
    )

  )

(defn jogo [vidas palavra acertos]
  (if (= vidas 0)
    (perdeu)
    (if (acertou-a-palavra-toda? palavra acertos)
      (ganhou)
      (avalia-chute (le-letra!) vidas palavra acertos)
      )
    )
  )

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World!"))

opa, bela explicação! :)

muito obrigado!!!