4clojure#58(撰写)...卡住

时间:2017-05-11 03:06:19

标签: clojure

尝试撰写(#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>

1 个答案:

答案 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。