fork download
  1. (ns example-two.core)
  2.  
  3. (def suits [:hearts :spades :clubs :diamonds])
  4. (def ranks [:2 :3 :4 :5 :6 :7 :8 :9 :10 :jack :queen :king :ace])
  5.  
  6. (def deck (vec (for [s suits, r ranks] [s r])))
  7.  
  8. (set! *warn-on-reflection* true)
  9.  
  10. (defprotocol ImmutableRandomNumberGenerator
  11. (next-long [self])
  12. (next-state [self]))
  13.  
  14. (defrecord LaggedFibonacciGenerator [
  15. ^long low-backref
  16. ^long high-backref
  17. ^long current-index
  18. ^longs state
  19. ]
  20. ImmutableRandomNumberGenerator
  21. (next-long ^long [self]
  22. (aget ^longs (:state self) (:current-index self)))
  23. (next-state ^LaggedFibonacciGenerator [self]
  24. (let [next-index (inc (:current-index self))
  25. low-backref (:low-backref self)
  26. high-backref (:high-backref self)
  27. low-index (mod (- next-index low-backref) high-backref)
  28. high-index (mod (- next-index high-backref) high-backref)
  29. old-state (long-array (:state self))
  30. low-value (aget old-state low-index)
  31. high-value (aget old-state high-index)
  32. new-state (aclone old-state)]
  33. (aset-long new-state next-index (unchecked-add ^long low-value ^long high-value))
  34. (LaggedFibonacciGenerator. low-backref high-backref next-index new-state))))
  35.  
  36. (defn- make-rng ^LaggedFibonacciGenerator []
  37. (let [seed-prng (java.security.SecureRandom.)
  38. init-state (long-array (repeatedly 55 #(.nextLong seed-prng)))]
  39. (LaggedFibonacciGenerator. 24 55 0 init-state)))
  40.  
  41. (defn shuffle-deck
  42. "Creates a shuffled deck of cards"
  43. []
  44. (loop [deck (transient deck), i (dec (count deck)), rng (make-rng)]
  45. (if (zero? i)
  46. (persistent! deck)
  47. (let [j (mod (next-long rng) i)]
  48. (recur (assoc! deck i (deck j) j (deck i))
  49. (dec i)
  50. (next-state rng))))))
  51.  
  52. (let [shuffled (shuffle-deck)]
  53. (println (count shuffled))
  54. (println shuffled))
Runtime error #stdin #stdout #stderr 1.95s 336128KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Exception in thread "main" java.lang.UnsupportedOperationException: Can't type hint a primitive local, compiling:(/home/KpE6mT/prog.clj:33:39)
	at clojure.lang.Compiler.analyze(Compiler.java:6519)
	at clojure.lang.Compiler.analyze(Compiler.java:6461)
	at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:979)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6709)
	at clojure.lang.Compiler.analyze(Compiler.java:6500)
	at clojure.lang.Compiler.analyze(Compiler.java:6461)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6704)
	at clojure.lang.Compiler.analyze(Compiler.java:6500)
	at clojure.lang.Compiler.analyze(Compiler.java:6461)
	at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3767)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6711)
	at clojure.lang.Compiler.analyze(Compiler.java:6500)
	at clojure.lang.Compiler.analyze(Compiler.java:6461)
	at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5837)
	at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6155)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6709)
	at clojure.lang.Compiler.analyze(Compiler.java:6500)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6697)
	at clojure.lang.Compiler.analyze(Compiler.java:6500)
	at clojure.lang.Compiler.analyze(Compiler.java:6461)
	at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5837)
	at clojure.lang.Compiler$NewInstanceMethod.parse(Compiler.java:8073)
	at clojure.lang.Compiler$NewInstanceExpr.build(Compiler.java:7609)
	at clojure.lang.Compiler$NewInstanceExpr$DeftypeParser.parse(Compiler.java:7490)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6709)
	at clojure.lang.Compiler.analyze(Compiler.java:6500)
	at clojure.lang.Compiler.analyze(Compiler.java:6461)
	at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5837)
	at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6155)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6709)
	at clojure.lang.Compiler.analyze(Compiler.java:6500)
	at clojure.lang.Compiler.analyze(Compiler.java:6461)
	at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5837)
	at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5272)
	at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3901)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6707)
	at clojure.lang.Compiler.analyze(Compiler.java:6500)
	at clojure.lang.Compiler.eval(Compiler.java:6765)
	at clojure.lang.Compiler.load(Compiler.java:7195)
	at clojure.lang.Compiler.loadFile(Compiler.java:7151)
	at clojure.main$load_script.invoke(main.clj:274)
	at clojure.main$script_opt.invoke(main.clj:336)
	at clojure.main$main.doInvoke(main.clj:420)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.lang.Var.invoke(Var.java:379)
	at clojure.lang.AFn.applyToHelper(AFn.java:154)
	at clojure.lang.Var.applyTo(Var.java:700)
	at clojure.main.main(main.java:37)
Caused by: java.lang.UnsupportedOperationException: Can't type hint a primitive local
	at clojure.lang.Compiler$LocalBindingExpr.<init>(Compiler.java:5742)
	at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6889)
	at clojure.lang.Compiler.analyze(Compiler.java:6482)
	... 47 more