pscm_cc 库 API 使用指南
pscm_cc 现在可以作为库被其他应用使用。本文档介绍如何使用 pscm_cc 的库接口。
概述
pscm_cc 提供了 C API,允许其他应用嵌入 Scheme 解释器。主要接口定义在 src/c/pscm_api.h 中。
基本使用
1. 初始化
在使用任何 pscm_cc 功能之前,必须先初始化:
c
#include "pscm_api.h"
int main() {
pscm_init();
// ... 使用 pscm_cc ...
return 0;
}2. 解析和求值
解析字符串
c
// 解析 Scheme 代码字符串,返回 AST
SCM *ast = pscm_parse("(+ 1 2)");解析文件
c
// 解析 Scheme 文件,返回表达式列表
SCM_List *exprs = pscm_parse_file("example.scm");求值 AST
c
// 求值一个 AST 节点
SCM *result = pscm_eval(ast);直接求值字符串
c
// 解析并求值字符串(一步完成)
SCM *result = pscm_eval_string("(+ 1 2)");求值文件
c
// 解析并求值文件中的所有表达式,返回最后一个结果
SCM *result = pscm_eval_file("example.scm");3. 环境操作
获取全局环境
c
SCM_Environment *env = pscm_get_global_env();创建新环境
c
// 创建新环境,继承全局环境
SCM_Environment *new_env = pscm_create_env(NULL);
// 或指定父环境
SCM_Environment *child_env = pscm_create_env(parent_env);4. 调试控制
c
// 启用/禁用调试输出
pscm_set_debug_enabled(true);
pscm_set_ast_debug_enabled(true);
// 查询当前状态
bool debug = pscm_get_debug_enabled();
bool ast_debug = pscm_get_ast_debug_enabled();5. 错误处理
c
// 设置自定义错误处理器
void my_error_handler(const char *message) {
fprintf(stderr, "Custom error: %s\n", message);
}
pscm_set_error_handler(my_error_handler);完整示例
c
#include "pscm_api.h"
#include <stdio.h>
int main() {
// 初始化
pscm_init();
// 求值简单表达式
SCM *result = pscm_eval_string("(+ 1 2)");
if (result) {
// 打印结果(需要包含 print.h 或使用其他打印函数)
print_ast(result);
printf("\n");
}
// 求值文件
SCM *file_result = pscm_eval_file("example.scm");
// 清理(当前为 no-op,但保留接口)
pscm_cleanup();
return 0;
}API 参考
初始化函数
void pscm_init(void)- 初始化 pscm_cc 库void pscm_cleanup(void)- 清理资源(当前为 no-op)
求值函数
SCM *pscm_eval(SCM *ast)- 求值 AST 节点SCM *pscm_eval_string(const char *code)- 解析并求值字符串SCM *pscm_eval_file(const char *filename)- 解析并求值文件
解析函数
SCM *pscm_parse(const char *code)- 解析字符串为 ASTSCM_List *pscm_parse_file(const char *filename)- 解析文件为表达式列表
环境函数
SCM_Environment *pscm_get_global_env(void)- 获取全局环境SCM_Environment *pscm_create_env(SCM_Environment *parent)- 创建新环境
调试函数
void pscm_set_debug_enabled(bool enabled)- 设置调试输出void pscm_set_ast_debug_enabled(bool enabled)- 设置 AST 调试输出bool pscm_get_debug_enabled(void)- 获取调试状态bool pscm_get_ast_debug_enabled(void)- 获取 AST 调试状态
错误处理
void pscm_set_error_handler(pscm_error_handler_t handler)- 设置错误处理器
字符串和符号转换
SCM *scm_from_c_string(const char *data, int len)- 从 C 字符串创建 Scheme 字符串SCM *scm_from_locale_stringn(const char *str, size_t len)- 从 C locale 字符串创建 Scheme 字符串char *scm_to_locale_stringn(SCM *str, size_t *lenp)- 将 Scheme 字符串转换为 C locale 字符串
过程调用
SCM *apply_procedure(SCM_Environment *env, SCM_Procedure *proc, SCM_List *args)- 应用 Scheme 过程SCM *apply_procedure_with_values(SCM_Environment *env, SCM_Procedure *proc, SCM_List *args)- 应用过程(参数已求值)SCM *eval_with_func(SCM_Function *func, SCM_List *l)- 求值 C/C++ 函数
文件加载
SCM *scm_c_primitive_load(const char *filename)- 加载并执行文件(C API,接受const char *)SCM *scm_c_primitive_load_from_scm(SCM *filename)- 加载并执行文件(Scheme API,接受SCM *)SCM *scm_eval_expression_list(SCM_List *expr_list)- 求值表达式列表
选项系统
SCM *scm_c_read_options_interface()- 获取读取选项接口SCM *scm_c_read_set(SCM *key, SCM *val)- 设置读取选项SCM *scm_c_read_enable(SCM *key)- 启用读取选项SCM *scm_c_read_disable(SCM *key)- 禁用读取选项SCM *scm_c_debug_options_interface()- 获取调试选项接口SCM *scm_c_debug_set(SCM *key, SCM *val)- 设置调试选项SCM *scm_c_debug_enable(SCM *key)- 启用调试选项SCM *scm_c_debug_disable(SCM *key)- 禁用调试选项
端口操作
SCM *scm_c_make_soft_port(SCM_List *args)- 创建软端口
注意事项
线程安全:当前实现不是线程安全的。如果需要在多线程环境中使用,需要添加适当的同步机制。
内存管理:pscm_cc 当前没有垃圾回收机制,所有分配的内存不会自动释放。
全局状态:pscm_cc 使用全局变量(
g_env,g_wind_chain等)。在多实例场景中需要注意状态隔离。错误处理:默认情况下,错误会通过
eval_error抛出异常。如果设置了错误处理器,可能会被调用。
与命令行工具的关系
pscm_cc 命令行工具现在使用这些库 API 实现。main.cc 中的代码展示了如何使用这些 API 构建一个完整的 Scheme 解释器。