3

我想MAX_OPERATIONS从一个帐户向另一个帐户进行多次 ( ) 次汇款。帐户作为参考存储在哈希映射调用程序中my-map(int account-id,double balance)。

汇款从哈希映射中获取“随机索引”并将其传递account-fromtransferaccount-destination并且amount都应该修复。

不幸的是我不能让它工作。

(defn transfer [from-account to-account amount]
  (dosync
    (if (> amount @from-account)
      (throw (Exception.  "Not enough money")))
    (alter from-account - amount)
    (alter to-account + amount)))

(defn transfer-all []
  (dotimes [MAX_OPERATIONS]
    (transfer (get mymap (rand-int[MAX_ACCOUNT]) :account-id) account-destination amount)))
4

2 回答 2

5

我立即看到的几个问题:

你的 dotimes 语法是错误的,你需要包含一个循环变量。就像是:

(dotimes [i MAX_OPERATIONS]
   ....)

rand-int 也只需要一个整数参数而不是向量,例如:

(rand-int MAX_ACCOUNT)

另外,我不确定您的 (get ...) 调用是否完全符合您的意图。如目前所写,:account-id如果找不到随机生成的整数键,它将返回关键字,这将导致问题,因为传输函数需要两个 refs 作为 from-account 和 to-account。

作为更一般的建议,您可能应该尝试在 REPL 上一点一点地编写代码,检查每个部分是否按预期工作。这通常是在 Clojure 中进行开发的最佳方式 - 如果您一次编写太多代码而没有对其进行测试,那么它可能包含多个错误,并且您可能会在试图追查问题的根源时迷失方向。

于 2012-03-05T14:27:51.187 回答
5

地图不实施 nth,因此您需要使用实施 nth 的中间结构。 您可以根据您想要的输出内容,对键或整个映射条目进行序列化。我喜欢用rand-nth这种东西,因为它读起来很好

您可以获得nth密钥的有效序列,然后随机使用一个:

user> (def mymap {:a 1, :b 2, :c 3})
#'user/mymap
user> (get mymap (rand-nth (keys mymap)))
1
user> (get mymap (rand-nth (keys mymap)))
1
user> (get mymap (rand-nth (keys mymap)))
3

或者你可以把地图变成一个有nth能力的矢量,然后随机抓取一个

user> (rand-nth (vec mymap))
[:a 1]
user> (rand-nth (vec mymap))
[:c 3]
于 2012-03-05T21:58:22.433 回答