Я взял все подкасты из ответов, выиграв 5 или лучше (и те в исходном вопросе) и добавил их к агрегированной странице на Cullect.com:
http://www.cullect.com/StackOverflow-Recommended-Podcasts
Это обеспечивает удобный способ получить представление об этих подкастах, а также способе предварительно просмотреть их, если Вы спешите или не хотите пробираться через все дубликаты в ответах. Я в настоящее время настраиваюсь как единственный куратор "cullection", но если кто-то еще хочет помочь сохранить скорректированным, когда ответы изменяются, сообщить мне.
Вы можете использовать форвардные объявления в Clojure, чтобы вы могли вызывать функции, которые еще не были определены.
(declare readCmd)
должно работать!
В Clojure вы определяете функции в следующем порядке. важно, функция не может вызывать другую функцию (или что-то еще в этом отношении), которая еще не была определена. Вот почему у нас есть форвардные объявления.
Как уже ответили другие, вам необходимо (объявить readCmd), чтобы исправить вашу непосредственную проблему.
Тем не менее, с этим кодом все еще есть проблемы, поскольку он фактически реализует итеративный процесс с использованием взаимного рекурсия (readCmd -> ajout -> readCmd -> imrimer -> readCmd -> ...), которая будет потреблять стек, и вы получите (при) переполнение стека. Лучший способ организовать это - сделать readCmd tail рекурсивным и заставить его вызывать действия. Когда действие возвращается, readCmd tail рекурсивно вызывает себя.
Также этот фрагмент кода:
((println "Ajout 8o") (ajout botin))
, вероятно, не то, что вы хотите сделать: он вызовет println и попытается использовать результат как функцию. Вместо этого используйте «do»:
(do (println "Ajout 8o") (ajout botin))
Вы также можете прочитать о case или cond, они упростят вложенные if.