Skip to content

[200_21] 升级到Goldfish Scheme v17.11.35#3076

Merged
da-liii merged 1 commit intomainfrom
hxh/200_21/v17.11.35
Apr 1, 2026
Merged

[200_21] 升级到Goldfish Scheme v17.11.35#3076
da-liii merged 1 commit intomainfrom
hxh/200_21/v17.11.35

Conversation

@wumoin
Copy link
Copy Markdown
Contributor

@wumoin wumoin commented Apr 1, 2026

No description provided.

@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Apr 1, 2026

Greptile Summary

本 PR 将 mogan 内嵌的 Goldfish Scheme 从 v17.11.32 升级到 v17.11.35,主要变化为将大量 Scheme 库文件(liii/oopliii/langliii/rich-*liii/datetime 等共 17 个文件)从本仓库中删除(已移入上游 Goldfish Scheme),同时在 goldfish.hpp 中对 CLI、加载路径管理和 doc 子命令进行了重构。

主要变更点:

  • 删除 17 个 Scheme 库文件:这些模块已随 Goldfish Scheme 上游一并发布,本地副本不再需要。
  • 新增 4 个 R7RS 标准库包装(scheme cxr)(scheme eval)(scheme read)(scheme write)
  • liii/string.scm:新增 string-contains?string-splitstring-replace 三个工具函数。
  • liii/path.scm:路径模块从 OOP 风格完整重写为基于 record 的纯函数实现。
  • goldfish.hpp:新增 -I/-A 加载路径选项、doc 子命令、~/.local/goldfish 插件自动发现机制;默认模式自动导入由 (liii oop) 改为 (liii string)
  • srfi-78:去除对 (liii lang) 的依赖,check:proc 默认比较器由 class=? 改为 equal?
  • srfi-214flexvector-add!assume 替换为显式 error,改善错误信息。
  • either.scm:将 either-contains 重命名为 either-contains?,符合 Scheme 谓词命名惯例。

需关注的问题:

  • path-append-text 缺少对 content 参数的字符串类型检查(P1)。
  • path-list-path 注释称返回路径对象,但实际返回字符串 vector(P1)。
  • srfi-78 默认比较器改为 equal? 后,case-class 断言行为变化(P2)。
  • discover_auto_goldfish_library_dirs 仅读取 $HOME,Windows 下不可用(P2)。
  • 默认 REPL 模式不再自动导入 (liii oop)(P2)。

Confidence Score: 4/5

存在两处 P1 问题(path-append-text 缺类型检查、path-list-path 返回类型与注释不符),建议修复后合并。

大多数变更是上游库版本同步,逻辑正确;但 path-append-text 遗漏类型守卫是明确的代码退化,path-list-path 注释与行为不一致可能导致调用方误用,因此评分 4/5。

TeXmacs/plugins/goldfish/goldfish/liii/path.scm(两处 P1)和 TeXmacs/plugins/goldfish/src/goldfish.hpp(Windows 兼容性、默认模式导入变更)需要重点关注。

Important Files Changed

Filename Overview
TeXmacs/plugins/goldfish/src/goldfish.hpp 主要 C++ 入口:版本号升到 17.11.35;新增 -I/-A 加载路径选项;新增 doc 子命令;重构 CLI 解析;新增 ~/.local/goldfish 插件自动发现(Windows 不兼容);默认模式导入由 (liii oop) 改为 (liii string)(潜在破坏性变更)。
TeXmacs/plugins/goldfish/goldfish/liii/path.scm 路径模块从 OOP 风格(rich-path)重写为基于 record 的纯函数实现;path-append-text 缺少类型检查守卫;path-list-path 注释称返回路径对象但实际返回字符串。
TeXmacs/plugins/goldfish/goldfish/srfi/srfi-78.scm 去掉 (liii lang) 依赖,改为 (scheme base);check:proc 默认比较器从 class=? 改为 equal?,可能影响 case-class 断言的测试行为。
TeXmacs/plugins/goldfish/goldfish/liii/string.scm 新增 string-contains?、string-split、string-replace 三个函数;将 srfi-13 的 string-replace 通过 except 排除以避免命名冲突;逻辑正确。
TeXmacs/plugins/goldfish/goldfish/srfi/srfi-214.scm 将 flexvector-add! 中的 assume 边界检查替换为显式 error 调用,提升错误报告质量。
TeXmacs/plugins/goldfish/goldfish/liii/either.scm 将 either-contains 重命名为 either-contains?,符合 Scheme 谓词命名惯例;并修复末尾缺少换行符的问题。
TeXmacs/plugins/goldfish/goldfish/scheme/write.scm 新增 R7RS (scheme write) 库包装,将 write-simple 和 write-shared 别名为 s7 的 write。
TeXmacs/plugins/goldfish/goldfish/scheme/eval.scm 新增 R7RS (scheme eval) 库,通过 s7 的 inlet 和 eval 实现 environment 函数。
TeXmacs/plugins/goldfish/goldfish/scheme/cxr.scm 新增 R7RS (scheme cxr) 库,导出所有 4 级 caar/cdr 组合,body 为空(依赖 s7 内置)。
TeXmacs/plugins/goldfish/goldfish/scheme/read.scm 新增 R7RS (scheme read) 库包装,导出 read,body 为空(依赖 s7 内置)。
TeXmacs/plugins/goldfish/goldfish/liii/range.scm 简化库定义,移除多余的 begin 块和注释,仅保留 define-library 包装。
TeXmacs/plugins/goldfish/goldfish/liii/list.scm 移除不再需要的 (liii case) 和 (only (liii oop) ...) 导入依赖。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[goldfish CLI 启动] --> B[parse_startup_cli_options]
    B --> C{解析参数}
    C -->|--mode / -m| D[设置 mode]
    C -->|-I DIR| E[prepend_dirs]
    C -->|-A DIR| F[append_dirs]
    C -->|command| G[记录 command & index]
    C -->|无效选项| H[display_help & exit]
    D & E & F & G --> I[apply_startup_load_path_options]
    I --> J[discover_auto_goldfish_library_dirs\n~/.local/goldfish/]
    I --> K[prepend_load_path_entries\nappend_load_path_entries]
    K --> L[customize_goldfish_by_mode\n默认导入 liii base + liii error + liii string]
    L --> M{command 类型}
    M -->|test| N[import liii goldtest\n调用 main 函数]
    M -->|doc| O[import liii golddoc\n调用 main 函数]
    M -->|run / fix / repl| P[原有逻辑]
    N & O & P --> Q[返回 exit code]
Loading

Reviews (1): Last reviewed commit: "升级到Goldfish Scheme v17.11.35" | Re-trigger Greptile

Comment on lines +547 to 549
(define (path-append-text p content)
(g_path-append-text (path->string p) content)
) ;define
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 path-append-text 缺少内容类型检查

path-write-text(第 540-545 行)在调用 C 层函数之前会验证 content 是否为字符串,而 path-append-text 省略了相同的守卫检查。如果传入非字符串参数,错误将在 C 层(g_path-append-text)内部触发,产生更难调试的错误信息,与 path-write-text 的行为不一致。

Suggested change
(define (path-append-text p content)
(g_path-append-text (path->string p) content)
) ;define
(define (path-append-text p content)
(if (not (string? content))
(type-error "path-append-text: content must be string")
(g_path-append-text (path->string p) content)
) ;if
) ;define

Comment on lines +631 to 641
;;; List directory contents as path objects
(define (path-list-path p)
(let ((base (path->string p)))
(let ((entries (listdir base)))
(vector-map
(lambda (entry) (path-join base entry))
entries
) ;vector-map
) ;let
) ;let
) ;define
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 path-list-path 返回字符串而非路径对象

函数注释写明 "List directory contents as path objects",但由于新版本的 path-join 始终返回字符串(string-append 的结果),path-list-path 实际返回的是字符串 vector 而非路径对象的 vector。这与旧实现(使用 rich-path 对象的 :/ 操作,返回路径对象)存在行为差异,可能破坏依赖该函数返回可调用路径对象的调用方代码。

如果新 API 设计上就是返回字符串,请更新注释以避免歧义:

Suggested change
;;; List directory contents as path objects
(define (path-list-path p)
(let ((base (path->string p)))
(let ((entries (listdir base)))
(vector-map
(lambda (entry) (path-join base entry))
entries
) ;vector-map
) ;let
) ;let
) ;define
;;; List directory contents as path strings
(define (path-list-path p)
(let ((base (path->string p)))
(let ((entries (listdir base)))
(vector-map
(lambda (entry) (path-join base entry))
entries
) ;vector-map
) ;let
) ;let
) ;define

) ;define

(define* (check:proc expression thunk expected-result (equal class=?))
(define* (check:proc expression thunk expected-result (equal equal?))
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 check:proc 默认比较器由 class=? 改为 equal?

旧实现使用 (liii lang)class=? 作为默认比较器,class=? 能够通过 :equals 方法正确比较 case-class 对象。改为 equal? 后,任何调用 (check (some-case-class-expr) => expected) 而不显式传入比较器的测试,将使用 Scheme 原生的 equal?,无法识别 case-class 的 equals 协议,可能导致原本通过的测试出现误判。

如果确认 SRFI-78 在 Goldfish 生态中不再用于 case-class 断言,则此变更可接受;否则建议在 changelog 或注释中明确说明该破坏性变更。

Comment on lines +4334 to +4340
discover_auto_goldfish_library_dirs () {
vector<string> dirs;
const char* home= getenv ("HOME");
if ((!home) || (!*home)) {
return dirs;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 discover_auto_goldfish_library_dirs 在 Windows 上不可用

该函数仅通过 getenv("HOME") 查找用户目录,但 Windows 通常不设置 HOME 环境变量(使用 USERPROFILEHOMEDRIVE+HOMEPATH)。如果 Goldfish 需要支持 Windows,此处应增加 fallback。若 Windows 平台已明确不支持插件自动发现,建议添加注释或编译期 guard 以防止混淆。

Comment on lines 3757 to 3759
if (mode == "default" || mode == "liii") {
s7_eval_c_string (sc, "(import (liii base) (liii error) (liii oop))");
s7_eval_c_string (sc, "(import (liii base) (liii error) (liii string))");
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 默认模式从导入 (liii oop) 改为 (liii string)

默认模式(default/liii)的启动导入由 (liii oop) 改为 (liii string)。这意味着在 REPL 中或不显式写 import 语句的脚本里,define-case-class@typed-define 等 OOP 宏将不再自动可用。若 mogan 内部有脚本依赖此行为,需要补充显式 (import (liii oop))。建议检查 mogan 自身的 Goldfish 脚本是否受影响。

Copy link
Copy Markdown
Contributor

@da-liii da-liii left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@da-liii da-liii merged commit d22516d into main Apr 1, 2026
2 checks passed
@da-liii da-liii deleted the hxh/200_21/v17.11.35 branch April 1, 2026 03:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants