【问题标题】:Why doesn't println of list behave like a list comprehension?为什么列表的 println 的行为不像列表理解?
【发布时间】:2012-06-26 15:19:45
【问题描述】:

为什么我的 println(示例的最后一行)不像列表推导式那样工作?我正在尝试使用以下代码来解决 Clojure 中 Project Euler 的问题 #2:

(def fibsq [0 1])

(defn second-to-last [sq]
  (nth sq (- (count sq) 2)))

(second-to-last fibsq)

(defn add-last-two [sq]
  (+ (last sq) (second-to-last sq)))

(defn add-to-fibsq [sq]
  (if (< (add-last-two sq) 100)
    (add-to-fibsq (conj sq (add-last-two sq)))
    sq))

;; putting it all together
(add-to-fibsq fibsq)

(println [x (add-to-fibsq fibsq) :when (even? x)])

我得到的输出如下:

(定义 ||[0 1]|| [0 1])

(defn 倒数第二个 [||[0 1 1 2 3 5 8 13 21 34 55 89]||] (nth ||[0 1 1 2 3 5 8 13 21 34 55 89]|| (- (计数 ||[0 1 1 2 3 5 8 13 21 34 55 89]||) 2)))

(倒数第二个 ||[0 1]||)|| => 0||

(defn add-last-two [||[0 1 1 2 3 5 8 13 21 34 55 89]||] (+ (last ||[0 1 1 2 3 5 8 13 21 34 55 89]||) (倒数第二个 ||[0 1 1 2 3 5 8 13 21 34 55 89]||)))

(defn add-to-fibsq [||[0 1 1 2 3 5 8 13 21 34 55 89]||] (if (

;;把它们放在一起 (add-to-fibsq ||[0 1]||)|| => [0 1 1 2 3 5 8 13 21 34 55 89]||

(println [x (add-to-fibsq ||[0 1]||) :when (even?x)])|| => java.lang.RuntimeException:无法解析符号:x in this 上下文,编译:(NO_SOURCE_PATH:19:2)||

这不是列表推导的工作方式吗?

【问题讨论】:

  • 我无法立即访问 Project Euler。您能否编辑您的问题以包含您要解决的问题的简要说明? tnx

标签: clojure list-comprehension


【解决方案1】:

Clojure 没有像您在最后一行中尝试使用的独立列表理解。您需要在最后一个表达式的开头调用for

(println (for [x (add-to-fibsq fibsq) :when (even? x)] x))

for 函数将值绑定到调用 (add-to-fibsq fibsq) 的结果中每个条目的 x。在这种情况下,即使for 也超出了要求

(println (filter even? (add-to-fibsq fibsq)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多