clozure clがおかしい

lemをcclで動かしてみたらどうにもsbclとは違うらしくうまく動かなかった

sbclとcclで違う結果になる小さなコードがこれ

;; example.lisp
(ql:quickload :lem-base :silent t)
(in-package :lem-base)

(let ((b (get-buffer-create "temp")))
  (insert-string (buffer-point b) "one")
  (insert-character (buffer-point b) #\newline)
  (insert-string (buffer-point b) "two")
  (uiop:println (line-string-at (buffers-end b))))

これは"temp"というバッファを作り、そのバッファに"one", 改行, “two” という順に挿入していき、バッファの末尾の行の文字列を表示します

sbclの場合

$ ros -L sbcl -l example.lisp -q
two

と正しい結果になる

一方cclでは

$ ros -L ccl-bin -l example.lisp -q
one

となぜか違う結果になってしまう

lemも一般的なエディタと同様、バッファに文字を挿入するときにemacsatomでいうマーカと同じ動作をするポイントがある
これはlispworksと全く一緒になってしまったので一応ドキュメントを貼っておく

6.3.4 Points

改行を挿入したときに、バッファ末尾を表すポイントが一行ずれないのが駄目なようなので それを行う関数にprintデバッグを加えてみる

;; src/base/buffer-insert.lisp
(defun shift-sticky-objects-newline (line charpos)
  (line-property-insert-newline line (line-next line) charpos)
  (format t "length: ~A~%" (length (line-points line))) ;test
  (let ((count 0))
    (dolist (p (line-points line))
      (format t "count: ~D~%" (incf count)) ;test
      (when (etypecase (point-kind p)
              ((eql :left-inserting)
               (<= charpos (point-charpos p)))
              ((eql :right-inserting)
               (< charpos (point-charpos p))))
        (point-change-line p (line-next line))
        (decf (point-charpos p) charpos)))))
$ ros -L sbcl -l example.lisp -q
WARNING: redefining LEM-BASE::SHIFT-STICKY-OBJECTS-NEWLINE in DEFUN
length: 3
count: 1
count: 2
count: 3
two
$ ros -L ccl-bin -l example.lisp -q
length: 3
count: 1
one

なぜかcclではリストの長さが3なのにdolistが1回のループで終わってしまった

dolistをloopマクロにしてみるとうまくいく

;; src/base/buffer-insert.lisp
(defun shift-sticky-objects-newline (line charpos)
  (line-property-insert-newline line (line-next line) charpos)
  (format t "length: ~A~%" (length (line-points line))) ;test
  (let ((count 0))
    (loop for p in (line-points line) do
      (format t "count: ~D~%" (incf count)) ;test
      (when (etypecase (point-kind p)
              ((eql :left-inserting)
               (<= charpos (point-charpos p)))
              ((eql :right-inserting)
               (< charpos (point-charpos p))))
        (point-change-line p (line-next line))
        (decf (point-charpos p) charpos)))))
$ ros -L ccl-bin -l example.lisp -q
length: 3
count: 1
count: 2
count: 3
two

clozure clのバージョン

? (lisp-implementation-version)
"Version 1.11-r16635  (LinuxX8664)"