The 21st 4clojure problem要求您实施nth
。
但是我试图实现它:
(defn my-nth
([s 0] (first s))
([s n] (recur s (- n 1))))
导致错误"不支持的绑定形式:0"
有人可以解释为什么这是错误以及如何修复它?
答案 0 :(得分:1)
在函数的参数中,不能指定值,只能指定符号。也许,你从Haskell借用了这种语法,你可以在那里做到这一点。但不是在Clojure。
在您的示例中,代码将是这样的:
(defn nth-my [coll index not-found]
(if (zero? index)
(if (empty? coll)
not-found
(first coll))
(recur (rest coll) (dec index) not-found)))
用法:
user> (nth-my [1 2 3] 0 "dunno")
1
user> (nth-my [1 2 3] 1 "dunno")
2
user> (nth-my [1 2 3] 2 "dunno")
3
user> (nth-my [1 2 3] 4 "dunno")
dunno
欢迎您通过以下方式改进它:
检查否定指数;要么立即返回nil
(或默认值),要么以相反的顺序从集合的末尾开始;
在未提供默认值时添加其他正文(未通过时将其设为nil
);
可能每次都使用循环/重复形式来传递最后一个默认参数。