我应该如何在clojure中代表国际象棋棋盘?

Dan*_*anS 7 java chess clojure

在Clojure(/ Java)中表示国际象棋比特的一些可能方法是什么?

http://pages.cs.wisc.edu/~psilord/blog/data/chess-pages/rep.html

我需要能够访问各个位并执行按位操作.

我想过使用java.lang.Long,但由于标牌,这导致了1x10 ^ 63的问题.我也不确定如何在特定索引处访问位?

我也看了BitSet,但理想情况下我需要一个固定的长度.

sw1*_*1nn 7

没有理由你不能使用直线长.正如你所指出的那样,问题在于java的(因此是clojure的)long是有符号的,只允许63位用于正数

默认情况下,Java允许算术溢出而不会出错.默认情况下,Clojure不允许算术溢出而不会出现错误(请参阅*unchecked-math* flag).它增加了对算术运算和强制转换的额外检查,因此,例如,(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
Run Code Online (Sandbox Code Playgroud)

有大量的unchecked-*操作可用(参见clojuredocs).

如果你使用笔直长并且unchecked-*你大部分都在那里进行操作,那么你可以使用这些bit-*操作来旋转/检查位.

最后将棋盘存储在原子中是有道理的,然后用它来更新它 (swap! chessboard fn args)

(2013年2月15日更新,稍微更惯用的交换!来电)

例如

(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 
Run Code Online (Sandbox Code Playgroud)