Racketで2つのnビットレジスタをバイナリ加算するための関数add-registersを作成しました(ヘルパーとしてビット加算関数を使用)。
(define (bit-add x y c)
(values (bitwise-xor x y c) (bitwise-ior (bitwise-and x y)
(bitwise-and x c)
(bitwise-and y c))))
(define (add-registers xs ys)
(let ([carry 0])
(values (reverse (for/list ([b1 (reverse xs)] [b2 (reverse ys)])
(let-values ([(nb nc) (bit-add b1 b2 carry)])
(set! carry nc)
nb)))
carry)))
しかし、私は自分のコードがかなり醜いことに気づきました。それで、これはもっと簡潔でエレガントに書くことができるのだろうか?