ストレートロングを使えないわけがありません。あなたが指摘したように、問題は、Javaの(したがってclojureの)longが署名されており、正の数に対して63ビットしか許可されていないことです
Java は、デフォルトで算術オーバーフローをエラーなしで許可します。Clojure は、デフォルトで、算術オーバーフローをエラーなしで許可しません ( *unchecked-math*フラグを参照してください)。算術演算とキャストに関する追加のチェックが追加されるため、たとえば、(byte 128)
例外が発生します。clojure v1.3.0以降(unchecked-byte)
、Javaの機能と同等の関数があります....
(unchecked-byte 128)
;=> -128 ; 2s-complement of 10000000
(unchecked-byte 2r10000001)
;=> -127 ; 2s-complement of 10000001
unchecked-*
利用可能な操作はたくさんあります ( clojuredocsを参照してください)。
ストレートロングとunchecked-*
操作を使用する場合、ほとんどの場合、bit-*
操作を使用してビットをいじったりチェックしたりできます。
最後に、チェス盤をアトムに格納するのは理にかなっており、次のように更新します。(swap! chessboard fn args)
(2013 年 2 月 15 日更新、少し慣用的な swap! 呼び出しを追加)
例えば
(inc Long/MAX_VALUE) ; java.lang.ArithmeticException
(unchecked-inc Long/MAX_VALUE) ; wraps.
-9223372036854775808
(def chessboard (atom 0))
@chessboard
;=> 0
(bit-test @chessboard 1)
;=> false
(swap! chessboard bit-flip 1)
;=> 2
(bit-test @chessboard 1)
;=> true
@chessboard
;=> 2
(reset! chessboard 0)
;=> 0
(swap! chessboard bit-flip 63)
;=> -9223372036854775808
(bit-test @chessboard 63)
;=> true