(def ok "whatever")
создает переменную с именем ok
во время компиляции . Компилятор просматривает всю форму, чтобы скомпилировать ее, обнаруживает, что вы определите переменную с именем ok
, и создает ее для вас (без привязки), прежде чем ваша форма будет фактически выполнена. Когда форма def
действительно выполняется, значение времени выполнения выражения будет присвоено переменной user/ok
. В вашем примере этого не происходит, потому что var уже создан, а ветвь if
идет другим путем.
Использование bound?
в качестве замены является ужасной идеей, поскольку она проверяет нечто совершенно иное: имеет ли указанная переменная var (которая должна существовать) привязку, либо постоянную, либо локальную для потока.