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)))
#'user / a
ユーザー>
(仕事をしている0
仕事をする1
仕事をする2
仕事をする3
仕事をする4
仕事をする5
仕事をする6
仕事をする7
仕事をする8
仕事をする9
nil nil nil nil nil nil nil nil nil nil)

doallまたはdorunを使用すると、すぐに作業が行われます。

user>(dorun(for [x(range 10)](println "doing work" x)))
仕事をしている0
仕事をする1
仕事をする2
仕事をする3
仕事をする4
仕事をする5
仕事をする6
仕事をする7
仕事をする8
仕事をする9
nil
user>(doall(for [x(range 10)](println "doing work" x)))
仕事をしている0
仕事をする1
仕事をする2
仕事をする3
仕事をする4
仕事をする5
仕事をする6
仕事をする7
仕事をする8
仕事をする9
(nil nil nil nil nil nil nil nil nil nil)
于 2012-06-28T20:49:33.573 に答える