正确使用Clojure for macro

时间:2017-04-02 13:57:13

标签: clojure

场上有100只水牛。 球场上有100个搅拌器。 每只站立的水牛吃5个搅拌器。 每只躺着的水牛都吃3个打蛋器。 每3只老牛吃1个搅拌器。 提交的每种类型的水牛有多少?

这是我的Clojure代码来解决这个问题:

;; s: number of Standing buffaloes
;; l: number of Lying buffaloes
;; o: number of Old buffaloes
(for [s (range 101) l (range 101) o (range 101)
      :while (and 
              (= 100 (+ s l o)
               (= 100 (+ (* s 5) (* l 3) (* o 1/3)))))]
     [s l o])

我的代码不起作用。它应该返回每种类型的水牛数量,但我的代码只返回一个空序列。它似乎在逻辑上是不正确的。怎么了?

2 个答案:

答案 0 :(得分:2)

2个主要问题:

  • 使用:while,一旦条件返回false,您就会告诉它停止搜索。我相信你的意图是跳过条件错误的情况。为此,您使用:when

  • 您的情况有一个错位的支撑,导致您比较布尔值和数字,这总是错误的。在(= 100 (+ s l o)的末尾添加一个大括号。如果你正在使用Cursive来写这个,请确保你垂直对齐表格,以便Parinfer可以为你管理大括号。

答案 1 :(得分:2)

<强>注释

@Carcigentate's advice带到使其正确,您可以快速启用 er:

$route['report/(:num)'] = "welcome/workout/$1";