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