(defun make-reread-stream (file-stream
&optional (restart-from :start)) "
A utility lambda for READing until EOF (= nil) repeatedly
open and close the stream yourself.
(values (read enclosed-stream nil nil) loopedp)
loopedp is T iff returned to restart-from"
(lambda () (let ((memory (read file-stream nil nil)))
(cond (memory (values (list memory nil)))
((not (equal (file-position file-stream)
(file-length file-stream)))
(values '(nil nil)))
((equal (file-position file-stream) (file-length file-stream))
(values (list nil
(file-position file-stream restart-from))))
(t (error "unknown condition"))))))
(defun diff-diff-signs (idx bit-array-1 bit-array-2 polynomial) "
matching bit-array-1's bit at idx for bit-array-2"
(loop for a across bit-array-1
for b across bit-array-2
for count from 0
for signed-ab = (* (b2s a) (b2s b))
summing (cond ((= count idx) (* +1 (b2s b)))
((not (= count idx)) signed-ab))
into plusp-idx-sum
summing (cond ((= count idx) (* -1 (b2s b)))
((not (= count idx)) signed-ab))
into minusp-idx-sum finally (return
(mapcar polynomial (list plusp-idx-sum minusp-idx-sum)))))))