Bug report:

Running Stefano's Sudoku example from his cells-doc in Lispworks for
Linux 5.1, got an error in record-caller:

  Error: The subscript 16 exceeds the limit 15 for the first dimension 
  of the array #*1111111111111111.
    1 (abort) Return to level 0.
    2 Return to top loop level 0.

Lispworks said the offending code was at the indicated line:

  (handler-case
      (setf (sbit (cd-usage *depender*) used-pos) 1)  ; <== ### here ###
    (type-error (error)
      (declare (ignorable error))
      (setf (cd-usage *depender*)
        (adjust-array (cd-usage *depender*) (+ used-pos 16) :initial-element 0))
      (setf (sbit (cd-usage *depender*) used-pos) 1))))

Fix:

The condition reported was of type CONDITIONS:SUBSCRIPT-OUT-OF-BOUNDS.
I added that to the handler-case, and then it worked:

  (handler-case
      (setf (sbit (cd-usage *depender*) used-pos) 1)
    ((or type-error conditions:subscript-out-of-bounds) (error)
    ;^^^            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      (declare (ignorable error))
      (setf (cd-usage *depender*)
        (adjust-array (cd-usage *depender*) (+ used-pos 16) :initial-element 0))
      (setf (sbit (cd-usage *depender*) used-pos) 1))))

However, this seems like a demonstrably error-prone way to handle this
particular situation, so I got rid of the handler-case entirely and
tried this:

  (let ((cd-usage (cd-usage *depender*)))
    (when (>= used-pos (array-dimension cd-usage 0))
      (setf cd-usage
            (setf (cd-usage *depender*)
                  (adjust-array (cd-usage *depender*)
                                (+ used-pos 16)
                                :initial-element 0))))
    (setf (sbit cd-usage used-pos) 1))
      
It works, doesn't depend on implementation-specific conditions, and in
my limited testing (I ran the sudoku solver three times using each
version), seems at least as fast, if not a tiny bit faster.

-- Larry

_______________________________________________
cells-devel site list
cells-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/cells-devel

Reply via email to