Skip to content

pscm_cc 功能现状与开发规划

本文档总结 pscm_cc 的现有功能特性,并规划实现驱动 TeXmacs 所需的功能。

pscm_cc 已实现 Scheme 的核心功能,包括:

  • ✅ 完整的类型系统
  • ✅ 核心特殊形式
  • ✅ Continuation 支持
  • ✅ 丰富的内置函数

一、现有功能总结

1.1 核心基础设施 ✅

  • 类型系统:统一 SCM 类型,支持 17 种数据类型(包括 PORT
  • 解析器:递归下降解析器,支持完整 Scheme 语法
  • 求值器:支持尾递归优化,模块化特殊形式处理
  • 环境系统:词法作用域,链表结构环境
  • 错误报告:源位置跟踪,清晰的错误信息

1.2 数据类型支持 ✅

类型状态说明
NIL空列表
LIST列表和点对
NUM整数
FLOAT浮点数
RATIO有理数(分数)
CHAR字符
STR字符串
SYM符号
BOOL布尔值
PROCScheme 过程
FUNCC/C++ 函数
CONTContinuation
MACRO
HASH_TABLE哈希表
VECTOR向量
PORT端口

1.3 特殊形式支持 ✅

  • 定义define, define-macro, lambda, set!
  • 控制流if, cond(支持 else=>), case, and, or, begin
  • 作用域let, let*, letrec(通过宏展开)
  • 循环do, for-each, map
  • 引用quote, quasiquote
  • 函数应用apply
  • Continuationcall/cc, call-with-current-continuation
  • 多值call-with-values, values
  • 动态控制dynamic-wind

1.4 内置函数支持 ✅

类型检查

procedure?, boolean?, null?, pair?, char?, number?

列表操作

car, cdr, cadr, cddr, caddr, cons, list, append, list-head, list-tail, last-pair, set-car!, set-cdr!

数字运算

  • 算术:+, -, *, /, expt, abs
  • 比较:=, <, >, <=, >=, negative?
  • 类型提升:整数、浮点数、分数混合运算

字符操作

char?, char->integer, integer->char, char=?, char<?, char>?, char<=?, char>=?, char-upcase, char-downcase

字符串操作

string-length, make-string, string-ref, string-set!, string=?, string<?, string<=?, substring, string-append, string->list, list->string, display, write, newline

相等性判断

eq?, eqv?, equal?

关联列表

assv, assoc, acons, assoc-ref, assoc-set!, assq-set!, assoc-remove!

哈希表

完整的哈希表操作集(创建、设置、获取、删除、遍历)

端口操作

open-input-file, open-output-file, open-input-string, open-output-string, close-input-port, close-output-port, read, read-char, peek-char, write-char, eof-object?, char-ready?, input-port?, output-port?, get-output-string, call-with-input-file, call-with-output-file, call-with-input-string, call-with-output-string

系统操作

exit

其他

gensym, not, eval

1.5 C/C++ 函数注册 ✅

  • scm_define_function:固定参数函数
  • scm_define_generic_function:泛型函数
  • scm_define_vararg_function:可变参数函数

二、缺失功能分析

2.1 端口(Port)系统 ✅

优先级:✅ 已完成

端口系统已完整实现,包括文件端口和字符串端口功能。

已实现功能

  • 端口类型:输入端口、输出端口 ✅
  • 文件端口
    • open-input-file filename → 输入端口 ✅
    • open-output-file filename → 输出端口 ✅
    • close-input-port port
    • close-output-port port
  • 字符串端口
    • open-input-string string → 输入端口 ✅
    • open-output-string → 输出端口 ✅
    • get-output-string port → 字符串 ✅
  • 端口操作
    • read port:从端口读取 Scheme 对象 ✅
    • read-char port:读取字符 ✅
    • peek-char port:查看下一个字符 ✅
    • eof-object? obj:判断是否为文件结束对象 ✅
    • char-ready? port:判断字符是否就绪 ✅
    • write-char char port:写入字符 ✅
  • 端口谓词
    • input-port? port:判断是否为输入端口 ✅
    • output-port? port:判断是否为输出端口 ✅
  • 端口包装
    • call-with-input-file filename proc
    • call-with-output-file filename proc
    • call-with-input-string string proc
    • call-with-output-string proc

2.2 文件加载系统 ⚠️

优先级:🔴 高

部分实现

  • parse_file:解析文件为 AST 列表 ✅
  • load:加载并执行文件 ❌

缺失功能

  • load filename:加载并执行 Scheme 文件
  • primitive-load filename:底层加载函数(Guile 兼容)
  • 加载路径管理:%load-path

实现要点

  1. 实现 load 函数,调用 parse_file 并逐个求值
  2. 支持相对路径和搜索路径
  3. 错误处理:文件不存在、解析错误等

2.3 模块系统 ❌

优先级:🟡 中

TeXmacs 大量使用模块系统组织代码。

缺失功能

  • 模块定义
    • define-module name:定义模块
    • current-module:获取当前模块
  • 模块使用
    • use-modules spec ...:使用模块
    • module-use! module spec:模块操作
  • 模块查询
    • resolve-module name:解析模块
    • module-ref module symbol:获取模块变量
    • module-map proc module:遍历模块绑定
  • 模块导出
    • define-public name value:定义并导出
    • export symbol ...:导出符号
    • re-export symbol ...:重新导出
  • 模块接口
    • %module-public-interface:模块公共接口

实现要点

  1. 添加 MODULE 类型
  2. 模块环境管理:每个模块有独立环境
  3. 模块解析:支持模块路径搜索
  4. 模块接口:公共接口与私有接口分离

2.4 错误处理机制 ⚠️

优先级:🟡 中

已实现功能

  • eval_error:错误报告 ✅
  • 源位置跟踪 ✅
  • 调用栈追踪:自动追踪表达式求值路径,错误时显示完整调用栈(最多 20 层)✅
  • 增强的错误报告:包含表达式类型、值、源位置和完整求值上下文 ✅

缺失功能

  • 异常捕获
    • catch tag thunk handler:捕获异常
    • throw key args ...:抛出异常
  • 错误对象
    • 错误类型系统
    • 错误消息格式化
  • 错误恢复
    • 优雅的错误处理(而非直接 exit(1)

实现要点

  1. 实现异常系统(可基于 continuation)
  2. 错误类型定义
  3. 错误处理流程改进(从 exit(1) 改为可恢复的错误处理)

2.5 更多特殊形式 ⚠️

优先级:🟡 中

已实现功能

  • case expr clause ...:多路分支 ✅
  • and expr ...:逻辑与(短路求值)✅
  • or expr ...:逻辑或(短路求值)✅

缺失功能

  • delay expr:延迟求值(Promise)
  • force promise:强制求值

实现要点

  1. delay/force:添加 PROMISE 类型

2.6 更多内置函数 ⚠️

优先级:🟢 低

已实现功能

  • 字符操作
    • char=?, char<?, char>?, char<=?, char>=?:字符比较 ✅
    • char-upcase, char-downcase:大小写转换 ✅
  • 字符串操作
    • string=?, string<?, string<=?:字符串比较 ✅
    • substring, string-append:字符串操作 ✅
    • string->list, list->string:转换 ✅
  • 向量操作
    • vector->list, list->vector:转换 ✅
  • 系统操作
    • exit code:退出程序 ✅

缺失功能

  • 系统操作
    • transcript-on filename:开始记录
    • transcript-off:停止记录

2.7 Guile API 兼容层 ❌

优先级:🔴 高

TeXmacs 通过 Guile C API 与 Scheme 交互。

缺失功能

  • 基本操作
    c
    SCM scm_cons(SCM car, SCM cdr);
    SCM scm_car(SCM pair);
    SCM scm_cdr(SCM pair);
    SCM scm_list1(SCM obj1);
    SCM scm_list2(SCM obj1, SCM obj2);
    SCM scm_list3(SCM obj1, SCM obj2, SCM obj3);
  • 求值
    c
    SCM scm_eval(SCM expr, SCM env);
    SCM scm_eval_string(const char* str);
    SCM scm_eval_file(const char* filename);
  • 环境
    c
    SCM scm_interaction_environment();
    SCM scm_current_module();
  • 变量操作
    c
    void scm_define(SCM env, SCM symbol, SCM value);
    SCM scm_lookup(SCM env, SCM symbol);
  • 过程调用
    c
    SCM scm_call(SCM proc, SCM args);
    SCM scm_apply(SCM proc, SCM args);
  • 错误处理
    c
    void scm_error(const char* subr, const char* fmt, ...);
    SCM scm_catch(SCM tag, SCM* (*thunk)(void*), void* data,
                  SCM* (*handler)(void*, SCM), void* handler_data);

实现要点

  1. 创建 guile_compat.hguile_compat.cc
  2. 类型转换:SCM*SCM(void*)
  3. API 映射:将内部实现映射到 Guile API
  4. 行为一致性:确保与 Guile 1.8 行为一致

2.8 垃圾回收(GC)❌

优先级:🔴 高

当前所有内存都不会释放,存在内存泄漏。

实现方案

  1. 标记-清除(Mark-and-Sweep)
    • 标记所有可达对象
    • 清除未标记对象
  2. 根对象注册
    • 全局环境
    • Continuation 栈
    • 当前执行上下文
  3. 对象遍历
    • 递归遍历所有引用
    • 标记可达对象

实现要点

  1. 统一内存分配接口
  2. 对象标记机制
  3. GC 触发时机(分配时、手动触发)
  4. 与 continuation 的兼容性

2.9 性能优化 ⚠️

优先级:🟢 低

当前问题

  • 环境查找:O(n) 线性搜索
  • 符号比较:使用 memcmp

优化方向

  1. 环境查找优化
    • 使用哈希表优化环境查找(哈希表已实现)
    • 将查找复杂度降至 O(1)
  2. 符号表优化
    • 符号去重(interning)
    • 快速符号比较
  3. 其他优化
    • 热点代码识别
    • 尾调用优化改进

This website is released under the MIT License.