Вы очень близки, вы должны просто использовать форму let
вместо def
здесь:
(defn create-contest
"Creates a monty hall doors contest"
[n]
(let [door-with-car (rand-int n)] ;; let instead of def
(map
(fn [i] (if (= i door-with-car) :car :closed))
(range n))))
def
свяжет некоторое значение с переменной в текущем пространстве имен, ноВы хотите связать значение в области действия этой функции, и для этого подходит let
.См. этот Q & A для другого объяснения.
(defn create-doors
"Create a collection of monty hall contests"
[doors contests]
(map
create-contest ;; no need to wrap create-contest in another function here
(repeat contests doors)))
Вам не нужно заключать create-contest
в другую функцию для использования с map
- вы можете просто передать функцию непосредственноmap
как значение.doall
необходим только для принудительной реализации отложенной последовательности из map
, поэтому вам, вероятно, не нужно / не нужно этого внутри create-doors
.
(create-doors 4 10)
=>
((:closed :closed :car :closed)
(:closed :closed :closed :car)
(:closed :car :closed :closed)
(:closed :closed :closed :car)
(:closed :car :closed :closed)
(:closed :car :closed :closed)
(:closed :car :closed :closed)
(:closed :closed :closed :car)
(:closed :closed :car :closed)
(:closed :closed :car :closed))