在哪里可以将打印功能放在Clojure中的循环/重复中?

时间:2017-08-14 14:25:50

标签: recursion clojure

Clojure入门和函数式编程。看一下在尚未发布的编程Clojure第三版第10章的范围内添加数字的慢速示例。

如何将println添加到此循环中,以便在更改时可以看到sum的值?

; performance demo only, don't write code like this 
(defn sum-to [n]
  (loop [i 1 sum 0]
    (if (<= i n)
      (recur (inc i) (+ i sum))
      sum)))

4 个答案:

答案 0 :(得分:3)

loop宏接受多个正文表达式,因此您可以在println表达式之前插入一个副作用if表达式:

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

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

不是你问题的答案,但是

  (reductions + (range 6))

给你你想要的东西。

答案 3 :(得分:0)

我经常用于此目的的一个方便工具是$ ./script.sh docker from the Tupelo library

它的工作原理如下:

spyx

结果:

(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))