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 clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to