2017-08-14 60 views

回答

3

loop宏接受全身多处表情,这样你就可以在你的if表达前右侧插入一个副作用的println表达:

(defn sum-to [n] 
    (loop [i 1 sum 0] 
    (println sum) 
    (if (<= i n) 
     (recur (inc i) (+ i sum)) sum))) 

这里的Clojure将使用在最后一个表达式的结果身体作为整个loop表达的返回值。例如:

(sum-to 5) 
;; 0 
;; 1 
;; 3 
;; 6 
;; 10 
;; 15 
;;=> 15 
0

不回答你的问题,但

(reductions + (range 6)) 

给你你在找什么。

+0

呀,看到的评论我的代码示例中从本书是“不写这样的代码”的首选例子:(defn best-sum-to [n](/(* n(inc n))2)) –

2

另一个方便的工具,在我看来可以解决您的问题,但以更清晰的方式而不是打印是一丝不苟。调试时非常有用。

(use 'clojure.tools.trace) 

    (defn sum-to 
    [n] 
    (loop [i 1 sum 0] 
    (if (<= i n) 
     (recur (inc i) (trace (+ i sum))) sum))) 

(sum-to 10) 
TRACE: 1 
TRACE: 3 
TRACE: 6 
TRACE: 10 
TRACE: 15 
TRACE: 21 
TRACE: 28 
TRACE: 36 
TRACE: 45 
TRACE: 55 
55 
+0

谢谢。当寻找解决方案时,我发现许多这样的工具和人们编写他们自己的工具。我的印象是没有社区同意的工具。我现在决定忍受印刷,直到我足够了解评估其他解决方案。在任何其他语言中,我使用日志包。我真的很喜欢这种追踪不需要更改代码,但我的目标之一就是知道该把它放在哪里。 –

0

一个方便的工具,我经常用于此目的是spyx宏观from the Tupelo library

它的工作原理就像这样:

(ns tst.demo.core 
    (:use demo.core tupelo.test) 
    (:require 
    [tupelo.core :as t])) 
(t/refer-tupelo) 

(defn sum-to [n] 
    (loop [i 1 sum 0] 
    (if (<= i n) 
     (recur (inc i) (spyx (+ i sum))) 
     sum))) 

(spyx (sum-to 5)) 

与结果:

(+ i sum) => 1 
(+ i sum) => 3 
(+ i sum) => 6 
(+ i sum) => 10 
(+ i sum) => 15 

(sum-to 5) => 15 
+0

我会将图珀洛放在我的工具列表中进行评估 –