(defun f (x &optional (length 1))
  (if (integerp x)
      (loop with bits = '()
            for (q r) = (multiple-value-list (floor x 2))
            then (multiple-value-list (floor q 2))
            repeat (max length (1+ (integer-length x)))
            do (push r bits)
            finally (return (if (and (eql x -1) (eql length 1))
                                (cons 1 bits)
                                bits)))
      (destructuring-bind (sign-bit . bits) x
        (loop for b in (if (zerop sign-bit)
                           bits
                           (mapcar (lambda (x) (logxor x 1)) bits))
              for i downfrom (1- (length bits))
              sum (* b (expt 2 i)) into n
              finally (return (if (zerop sign-bit) n (- (1+ n))))))))

(loop for args in '((10)
                    (10 8)
                    (-8)
                    (-8 8)
                    (-1)
                    nil
                    ((0 1 1 1))
                    ((1 1 1 1))
                    ((1 0 0 0))
                    nil
                    (1)
                    (1 1)
                    (1 2)
                    (-1)
                    (-1 1)
                    (-1 2)
                    nil
                    ((0 1))
                    ((1))
                    ((1 1))
                    nil
                    (0)
                    ((0)))
      do (if args
             (format t "~{~S~^, ~}~10T-> ~S~%" args (apply #'f args))
             (terpri)))
