scheme-langserver
Scheme-langserver 是基于 Chez Scheme 并兼容 scheme r6rs 的 language server protocol 实现,提供自动完成、定义跳转、悬停文档等功能,专注于解决 Scheme 和 Lisp 方言在静态分析上的挑战。
项目地址:https://github.com/ufo5260987423/scheme-langserver项目标题:scheme-langserver项目描述:Scheme-langserver 是基于 Chez Scheme 并兼容 scheme r6rs 的 language server protocol 实现。它为未完成的代码做编程辅助,提供包括自动完成、定义跳转等功能。这些功能是基于对 r6rs 标准的 scheme 进行静态分析得到的。一些辅助功能如自动完成、定义跳转、鼠标悬停显示文档等功能对于编程十分有帮助。但是,和其他的编程语言如 java、python、javascript 和 c,lisp 系的语言服务器协议实现(language server protocol implementation)几乎是一篇空白。emacs 的 Geiser、Dr. Racket 的 racket langserver 还有 swish-lint 等等,他们的工作基本上是基于 repl(Read-Eval-Print Loop)或者词法解析器的,而不是基于编程的一般过程。例如,如果程序员正参与一个未完成的项目,里面的代码还并不是都能跑起来,Geiser 或者其他的竞品都只能提供对顶级变量、标识符的自动补全,这些标识符在 Chez Scheme 里面一般都通过 environment-symbols 过程列出来。也就是说,对于未完成的代码和局部标识符、局部变量(在其他语言中自动完成功能主要就是在补全它们),Geiser 等等无济于事。类似的事情同样出现在定义跳转等其他功能上。一个根本的原因是,scheme 和 lisp 的其他方言具有丰富的数据结构和灵活的控制机制,这让代码的静态分析变成了一个很大的挑战。scheme 甚至没有通用的项目管理框架及对应的文件扩展名。以.ss 和.scm 为例,大多数程序员假设使用这两个文件扩展名的代码被用于一个正在运行中的环境,并且并不明示代码所需要的库信息。虽然 Akku 和 Snow 鼓励通过.sls 和.sld 提供文件信息并建构一套稳定的库管理框架,但是 involve、load 和很多其他过程让库链接动态化,这就更不可能在代码静态分析阶段得到什么信息了。目前,scheme-langserver提供了如下功能:1. 顶级变量和局部变量的自动补全;2. 定义跳转;
3. 兼容包管理工具: Akku;4. 代码索引更新机制;5. Hover;6. 代码文件层面的变量引用与高亮;
7. 代码文件中的符号表;
8. 捕获宏*-syntax(define-syntax, let-syntax, etc.) 中的局部绑定; 9. 跨平台的多线程索引机制;10. 兼容sps拓展的代码;11. 对API请求进行窥孔优化;当前正在开发中的功能主要包括代码的自动缩进和一定程度的类型推断。项目愿景:1. 希望有更多的人参与到对代码的贡献和捉虫(debug);2. 希望有人能把miniKanren进行改造,以适用于scheme的类型推断(请和项目作者联系,共同探讨其中的具体问题);3. 要是有人愿意捐点钱就更好了哈哈哈哈。