Во-первых, у вас есть ошибка: [[y & t] x]
уничтожает x
, но следующая проверка empty?
на t
означает, что вы игнорируете последний элемент в последовательности.Вы можете увидеть это с помощью
(my-some even? [2])
=> nil
. Вы можете заменить (if (empty? x) nil (else-form))
на when
и seq
:
(when (seq x) ...)
, а затем использовать first
и next
длядеконструируйте последовательность:
(defn my-some [f x]
(when (seq x)
(if (f (first x))
(f (first x))
(recur f (rest x)))))
вызов recur
возвращается в my-some
, поэтому вам нужно передать предикат f
.
, который можно заменить (if x x (else ....))
на(or x (else ...))
:
(defn my-some [f x]
(when (seq x)
(or (f (first x)) (recur f (next x)))))
Вы можете сравнить это с implementation of some