尝试撰写(#58)
(defn compose [& fns]
(fn [a & opts]
(if opts
;println can be removed, just shows my confusion
(reduce (fn [x y] (println(apply y (list x))) (apply y (list x))) (cons a opts) (reverse fns)))
(reduce (fn [x y] (y x)) a (reverse fns))))
((compose rest reverse) 1 2 3 4)
我已经花了太多时间在这上面所以我求助于帮助......我只有大约2-3天的经验,所以原谅丑陋的咒语,最有可能形式不必要。我想知道这有什么问题,而不是得到一个完全不同的(并且我确定更好)答案。
令我困惑的是,错误表明我正在尝试将列表作为函数调用,但print语句正在显示我期望的结果,使用与函数体相同的代码。 / p>
答案 0 :(得分:1)
我认为你的错误是在错误的地方。这有效:
(defn compose [& fns]
(fn [a & opts]
(if opts
(reduce (fn [x y] (apply y (list x))) (cons a opts) (reverse fns))
(reduce (fn [x y] (y x)) a (reverse fns)))))
我很容易立即看到问题因为我使用的是一个了解parens和alignment的编辑器 - 我只是把你的代码放在IntelliJ / Cursive中。 Cursive使用结构编辑(也称为Paredit)。
同时调试时请注意println
返回nil。我经常使用探测函数进行这种调试:
(defn probe-on
([x]
(println x)
x)
([x msg]
(println msg x)
x))
,但你现在可以(或者来,它们仍然有点新)获得不需要你使用这种调试技术的编辑器/调试器。见proto-REPL和Sayid。