Không có lý do gì bạn không thể sử dụng một thời gian dài. Vấn đề, như bạn đã lưu ý, đó là thời gian dài của java (và do đó clojure) được ký, chỉ cho phép 63 bit cho các số dương
Java, cho phép tràn số học mà không có lỗi. Theo mặc định, Clojure không cho phép tràn số học mà không có lỗi (xem *unchecked-math* cờ). Nó cho biết thêm kiểm tra xung quanh hoạt động số học và phôi, vì vậy, ví dụ, (byte 128)
sẽ gây ra một ngoại lệ. Kể từ clojure v1.3.0 có chức năng như (unchecked-byte)
tương đương với các chức năng java ....
(unchecked-byte 128)
;=> -128 ; 2s-complement of 10000000
(unchecked-byte 2r10000001)
;=> -127 ; 2s-complement of 10000001
Có một bè toàn bộ unchecked-*
hoạt động có sẵn (see clojuredocs).
Nếu bạn sử dụng một thời gian dài và các hoạt động unchecked-*
bạn chủ yếu ở đó, và sau đó bạn có thể sử dụng các hoạt động bit-*
để kiểm tra/kiểm tra bit.
Cuối cùng lưu trữ bàn cờ của bạn trong một nguyên tử có ý nghĩa, và sau đó bạn nên cập nhật nó với (swap! chessboard fn args)
(cuộc gọi được cập nhật 15/02/13 với swap hơi nhiều thành ngữ!)
ví dụ
(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
'cách tốt nhất' - hiển thị mã của bạn trên http://codereview.stackexchange.com/; 'Làm thế nào tôi' - không xây dựng. Bạn có mã nào? Yêu cầu của bạn là gì? Bạn bị mắc kẹt ở đâu? – sehe
@sehe Tôi đã thử sử dụng java.lang.Long nhưng gặp sự cố với parseLong() và "10000 ... x63" - 1x10^63) Ngoài ra, tôi không chắc chắn liệu mình có thể truy cập bit tại một địa chỉ cụ thể hay không mục lục? Tôi đang yêu cầu các đề xuất và ý tưởng hợp lý hóa, không nhất thiết là tuyệt đối. – DanS
Bạn nên chỉnh sửa các chi tiết này vào câu hỏi của mình. – sehe