Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions devel/0007.md
Original file line number Diff line number Diff line change
@@ -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` 参数一致,确保生成的换行符数量正确。
22 changes: 9 additions & 13 deletions tools/fmt/liii/goldfmt-format.scm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions tools/fmt/tests/liii/goldfmt-format/format-string-test.scm
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading