I am seeing a difference in running the contents of a function vs.
running the function by name in a REPL. I am writing a simple
blackjack game in Clojure, and have a ref called 'cards' for
representing the state of the game. I initialize it this way:
user> (dosync (alter cards assoc
:deck (build-deck card-values card-suits)
:house (list)
:player (list)))
{:deck ((8 \S) (2 \C) (6 \C) (8 \D) (6 \H) (\A \H) (8 \C) (7 \H) (\A
\C) (2 \D) (\K \H) (10 \D) (4 \H) (6 \S) (2 \H) (\Q \H) (3 \D) (10 \S)
(3 \S) (1 \S) (\A \D) (9 \H) (\J \S) (4 \D) (1 \C) (\K \D) (2 \S) (1
\H) (5 \C) (\K \C) (10 \H) (9 \D) (9 \C) (\J \D) (\Q \C) (7 \S) (7 \D)
(9 \S) (1 \D) (\J \H) (10 \C) (6 \D) (\K \S) (5 \H) (\J \C) (7 \C) (4
\C) (\Q \D) (\Q \S) (5 \D) (\A \S) (3 \C) (3 \H) (4 \S) (8 \H) (5
\S)), :player (), :house ()}
I have defined the following function to deal cards from the deck to the player,
(defn deal
([]
(dosync
(alter cards assoc
:deck (build-deck card-values card-suits)
:house (list)
:player (list)))
(deal 2 :player)
(deal 2 :house))
([n hand]
(dosync
(alter cards assoc
hand (concat (get @cards hand) (take n (get @cards :deck)))
:deck (take-last (- (count (get @cards :deck)) n) (get @cards :deck))))))
Now, the two-parameter version of this function works when I
initialize cards and invoke the code manually,
user> (let [n 2 hand :house] (dosync
(alter cards assoc
hand (concat (get @cards hand) (take n (get @cards :deck)))
:deck (take-last (- (count (get @cards :deck)) n) (get @cards :deck)))))
{:deck ((6 \C) (8 \D) (6 \H) (\A \H) (8 \C) (7 \H) (\A \C) (2 \D) (\K
\H) (10 \D) (4 \H) (6 \S) (2 \H) (\Q \H) (3 \D) (10 \S) (3 \S) (1 \S)
(\A \D) (9 \H) (\J \S) (4 \D) (1 \C) (\K \D) (2 \S) (1 \H) (5 \C) (\K
\C) (10 \H) (9 \D) (9 \C) (\J \D) (\Q \C) (7 \S) (7 \D) (9 \S) (1 \D)
(\J \H) (10 \C) (6 \D) (\K \S) (5 \H) (\J \C) (7 \C) (4 \C) (\Q \D)
(\Q \S) (5 \D) (\A \S) (3 \C) (3 \H) (4 \S) (8 \H) (5 \S)), :player
(), :house ((8 \S) (2 \C))}
but calling (deal 2 :house) bombs out with the following stacktrace:
clojure.lang.Ref cannot be cast to clojure.lang.Associative
[Thrown class java.lang.ClassCastException]
Restarts:
0: [ABORT] Return to SLIME's top level.
Backtrace:
0: clojure.lang.RT.assoc(RT.java:666)
1: clojure.core$assoc__4268.invoke(core.clj:144)
2: clojure.core$assoc__4268.doInvoke(core.clj:146)
3: clojure.lang.RestFn.invoke(RestFn.java:483)
4: user$deal__2081$fn__2084.invoke(NO_SOURCE_FILE:55)
5: clojure.lang.AFn.call(AFn.java:31)
6: clojure.lang.LockingTransaction.run(LockingTransaction.java:263)
7:
clojure.lang.LockingTransaction.runInTransaction(LockingTransaction.java:231)
8: user$deal__2081.invoke(NO_SOURCE_FILE:55)
9: user$eval__3276.invoke(NO_SOURCE_FILE:1)
10: clojure.lang.Compiler.eval(Compiler.java:4642)
11: clojure.core$eval__5254.invoke(core.clj:2031)
12: swank.commands.basic$eval_region__907.invoke(basic.clj:40)
13: swank.commands.basic$eval_region__907.invoke(basic.clj:31)
14: swank.commands.basic$eval__927$listener_eval__929.invoke(basic.clj:54)
15: clojure.lang.Var.invoke(Var.java:359)
16: user$eval__3273.invoke(NO_SOURCE_FILE)
17: clojure.lang.Compiler.eval(Compiler.java:4642)
18: clojure.core$eval__5254.invoke(core.clj:2031)
19: swank.core$eval_in_emacs_package__455.invoke(core.clj:59)
20: swank.core$eval_for_emacs__533.invoke(core.clj:128)
21: clojure.lang.Var.invoke(Var.java:367)
22: clojure.lang.AFn.applyToHelper(AFn.java:179)
23: clojure.lang.Var.applyTo(Var.java:476)
24: clojure.core$apply__4379.invoke(core.clj:434)
25: swank.core$eval_from_control__458.invoke(core.clj:66)
26: swank.core$eval_loop__461.invoke(core.clj:71)
27: swank.core$spawn_repl_thread__595$fn__627$fn__629.invoke(core.clj:183)
28: clojure.lang.AFn.applyToHelper(AFn.java:171)
29: clojure.lang.AFn.applyTo(AFn.java:164)
30: clojure.core$apply__4379.invoke(core.clj:434)
31: swank.core$spawn_repl_thread__595$fn__627.doInvoke(core.clj:180)
32: clojure.lang.RestFn.invoke(RestFn.java:402)
33: clojure.lang.AFn.run(AFn.java:37)
34: java.lang.Thread.run(Thread.java:619)
Any ideas? This feels like a really dumb question, but I've been
poking at this for two days and can't figure it out.
Mike
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en