diff --git a/devel/0007.md b/devel/0007.md new file mode 100644 index 00000000..98defe48 --- /dev/null +++ b/devel/0007.md @@ -0,0 +1,29 @@ +# [0007] 修复格式化时多余空行的问题 + +## PR 目的 +修复 `bin/gf fmt tests/scheme/base/list-tail-test.scm` 会在 `list-tail-test.scm` 中新增空行的问题。 + +## 任务相关的代码文件 +- tools/fmt/liii/goldfmt-format.scm + +## 如何测试 +```bash +# 1. 构建 +xmake b goldfish + +# 2. 运行格式化测试 +bin/gf tests/goldfish/liii/goldfmt-test.scm +``` + +## 2026-05-07 修复 reader-newlines 生成多余换行的问题 +### What +修复 `reader-newlines` 函数中循环初始值错误,导致格式化输出时插入多余空行的问题。 + +1. 将 `reader-newlines` 的循环初始值从 `(+ count 1)` 改为 `count` +2. 该函数用于根据 `*newline*` 标记生成对应数量的换行符 + +### Why +原实现中 `(let loop ((i (+ count 1)) ...)` 会导致实际生成的换行符数量比预期多一个,格式化后的代码会出现多余的空行。 + +### How +修正 `let loop` 的初始绑定值,使其与 `count` 参数一致,确保生成的换行符数量正确。 diff --git a/tools/fmt/liii/goldfmt-format.scm b/tools/fmt/liii/goldfmt-format.scm index 00494ba1..55fc4f34 100644 --- a/tools/fmt/liii/goldfmt-format.scm +++ b/tools/fmt/liii/goldfmt-format.scm @@ -215,7 +215,7 @@ (define (reader-newlines count) (let loop - ((i (+ count 1)) (result "")) + ((i count) (result "")) (if (<= i 0) result (loop (- i 1) (string-append result "\n"))) ) ;let ) ;define @@ -470,9 +470,7 @@ ((i 0) (column 0)) (if (>= i (string-length text)) column - (loop (+ i 1) - (if (char=? (string-ref text i) #\newline) 0 (+ column 1)) - ) ;loop + (loop (+ i 1) (if (char=? (string-ref text i) #\newline) 0 (+ column 1))) ) ;if ) ;let ) ;define @@ -509,15 +507,13 @@ ) ;let ) ; ((null? current) (reader-append-close result close-indent)) - (else (reader-append-close - (let* ((prefix (if prefix-ready? "" (string-append "\n" (spaces rest-indent))) - ) ;prefix - (before-tail (string-append result prefix ". ")) - ) ; - (string-append before-tail - (format-reader-datum-at current (last-line-column before-tail)) - ) ;string-append - ) ;let* + (else (reader-append-close (let* ((prefix (if prefix-ready? "" (string-append "\n" (spaces rest-indent)))) + (before-tail (string-append result prefix ". ")) + ) ; + (string-append before-tail + (format-reader-datum-at current (last-line-column before-tail)) + ) ;string-append + ) ;let* close-indent ) ;reader-append-close ) ;else diff --git a/tools/fmt/tests/liii/goldfmt-format/format-string-test.scm b/tools/fmt/tests/liii/goldfmt-format/format-string-test.scm index 44bc1251..54b9c65e 100644 --- a/tools/fmt/tests/liii/goldfmt-format/format-string-test.scm +++ b/tools/fmt/tests/liii/goldfmt-format/format-string-test.scm @@ -125,27 +125,27 @@ ;; quote/quasiquote 内部由 scan-file 注入的 (*newline* n) 应展开为真实空行 (check (format-first-node-file "007_01.scm") => - "`(begin\n\n (define ,name ,value))" + "`(begin\n (define ,name ,value))" ) ;check (check (format-first-node-file "007_02.scm") => - "'(begin\n\n (define x 1))" + "'(begin\n (define x 1))" ) ;check (check (format-first-node-file "007_03.scm") => - "`(begin\n\n\n (define ,name ,value))" + "`(begin\n\n (define ,name ,value))" ) ;check (check (format-first-node-file "007_04.scm") => - "`(begin\n (define x ,a)\n\n (define y ,b)\n (define z ,c))" + "`(begin\n (define x ,a)\n (define y ,b)\n (define z ,c))" ) ;check (check (format-datum '(quote #(a (*newline* 1) b))) => - "'#(a\n\n b\n ) ;#" + "'#(a\n b\n ) ;#" ) ;check (check (format-datum '#((alpha beta gamma delta epsilon zeta eta theta iota kappa)