2

我正在尝试使用 for-macro 显示 menu-items 变量中的项目:

(defrecord MenuItem
  [select-char description])

(def menu-items [(MenuItem. "1" "add an expense")
         (MenuItem. "2" "add an income")
         (MenuItem. "0" "exit")])

(defn display-menu [items]
  (for [item items]
    (println (:select-char item))))

(defn menu-prompt [items]
  (display-menu items)
  (read-val ">>>"))

(println menu-items)
(menu-prompt menu-items)

但是,只显示 >>> 提示。有人可以解释为什么会这样,以及如何显示这些项目吗?

4

1 回答 1

2

这是“懒虫”的案例

for 生成一个惰性序列,该序列仅在读取时进行评估。
对 display-menu 的调用只是返回对列表的引用,然后继续它的结婚方式,什么也没做。

将其包装在调用中doall

user> (def a (for [x (range 10)] (println "doing work" x)))
#'用户/一个
用户>一个
(工作0
做工作 1
做工作 2
做工作 3
做作业 4
做作业 5
做作业 6
做作业 7
工作 8
工作 9
无 无 无 无 无 无 无 无 无 无 无)

如果您使用 doall 或 dorun 那么它将立即完成工作。

user> (dorun (for [x (range 10)] (println "doing work" x)))
工作 0
做工作 1
做工作 2
做工作 3
做作业 4
做作业 5
做作业 6
做作业 7
工作 8
工作 9
零
user> (doall (for [x (range 10)] (println "doing work" x)))
工作 0
做工作 1
做工作 2
做工作 3
做作业 4
做作业 5
做作业 6
做作业 7
工作 8
工作 9
(无 无 无 无 无 无 无 无 无 无 )
于 2012-06-28T20:49:33.573 回答