我写了 scheme-langserver,大家有什么想要问的问题么?

2023-01-24 10:13:44 +08:00
 ufo5260987423

Scheme-langserver 是基于 Chez Scheme 并兼容 scheme r6rs 的 language server protocol 实现。它最大的特点是基于未完成的代码做编程辅助,包括自动完成、定义跳转等。这些功能是基于对 r6rs 标准的 scheme 进行静态分析得到的。它被发布在 Akku 和 github 。

一些辅助功能如自动完成、定义跳转、鼠标悬停显示文档等功能对于编程十分有帮助。但是,和其他的编程语言如 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-langserver 已经发布了 1.0.10 版本,通过多线程加速了代码索引过程。

2796 次点击
所在节点    Visual Studio Code
29 条回复
BBCCBB
2023-01-24 11:00:10 +08:00
Chez Scheme 真的是最吊的吗
enchilada2020
2023-01-24 11:08:53 +08:00
cool 不过找半天发现没贴地址
https://github.com/ufo5260987423/scheme-langserver
ufo5260987423
2023-01-24 11:21:32 +08:00
@enchilada2020 哈哈,感谢。
ufo5260987423
2023-01-24 11:23:17 +08:00
@BBCCBB 其实也要看情况,比如 Chez 的 String 实现效率貌似就不是很高。
zhizunzz
2023-01-24 11:24:41 +08:00
本人由于太菜而问不出问题, star+1
ufo5260987423
2023-01-24 11:33:46 +08:00
@zhizunzz 也欢迎问一些关于解释器的其他问题啦。
gowl
2023-01-24 13:42:21 +08:00
ufo5260987423
2023-01-24 14:11:41 +08:00
@gowl 噗,我一直不太想当地球人。
gowl
2023-01-24 14:20:16 +08:00
@ufo5260987423 因为地球人好战么?
ufo5260987423
2023-01-24 14:30:29 +08:00
@gowl 因为这样我处理地球人的时候就不用太有心理压力了 2333
gowl
2023-01-24 14:40:58 +08:00
😂
ksco
2023-01-24 15:18:57 +08:00
楼主是怎么学习 Scheme 的呀
ufo5260987423
2023-01-24 15:28:16 +08:00
@ksco 大概十年前就开始搞一些 lisp 的方言,比如 clojure 。不过正经搞也就是去年 7 月份的事情(你可以去看一下 scheme-langserver 的提交记录)。
实际上我基本上是拿 chez scheme 当 C 语言那么写,基本上写一下就会发现,你能写出来代码和会不会用 lisp 的高级特性无关。
当然入门写 scheme 其实不太友好,因为各种现代工具太少了,我写 scheme-langserver 也是希望大家都来玩 scheme 。
zhuangzhuang1988
2023-01-24 19:48:34 +08:00
每次打一个字就整体 parser 一遍么?
ufo5260987423
2023-01-24 20:05:26 +08:00
@zhuangzhuang1988
1 、不是 parse ,而是更新 index 。因为 lsp 面对的很多代码可能是无法很好的 parse 的。
2 、更新的 scope 是文件级别的。因为 lisp 的控制过于灵活,很多情况下你更新一个字(比如一个左括号)都会导致语义的重大区别(但是仍然有 define-top-level-value 这种鬼畜的东西存在);理想的更新当然是只更新牵涉更改的 index ,但是这肯定是很靠后的事情了;
3 、目前更新索引对使用的影响还马马虎虎能够接受,so……
当然了,有好的想法的话希望可以讨论一下。O(∩_∩)O 谢谢
gowl
2023-01-24 20:23:21 +08:00
楼主写 Lisp 这么多年头儿,有没有体会到哪些 Lisp (尤其是 Scheme )的优势在实际使用中别的的函数式语言(尤其是静态类型的函数式语言)不可替代的地方呢?
ufo5260987423
2023-01-24 21:11:58 +08:00
@gowl 我用过的其他静态类型的函数式语言只有 clojure ,所以我这里只能告诉你两点:
1 、我为啥不用 clojure 、haskell 、racket 、ocaml 、rust 等等。
2 、我为啥用 scheme
----
我认为首先要确认一下,我喜欢的 scheme 是执行了 r6rs 标准的 Chez Scheme ,它具有如下特点:
1 、核心非常小,透过语法我可以直接看见 c 看见汇编,我也可以看见逻辑表达式。
2 、速度非常快(堪比手写,未经优化的 C ,如果你认真研究过 r6rs 的标准并且认真写代码的话),我写 scheme-langserver 的一个目标是用来辅助开发一些机器学习的东西。
3 、由于发展历史非常长,有大量的各个领域的库可以用(当然不太好找,很多还要自己调试,但是现在有 akku 和 github 了)

相比之下,
1 、十年前的 clojure 太慢(现在好像仍然这样),而且它们的目标似乎是用灵活性解决商业问题——过度灵活的商业问题恰恰意味着盈利不稳定,而在一定范围内稳定的商业问题可以通过开发各种框架解决。所以我不用 clojure 。
2 、haskell 的主要特点似乎是:它是一个 prover ,用各种数学证明保证你是正确的。我对这个没有太多的感觉,我认为保证正确——这个事情应该让程序语言以外的静态检查、开发工具去解决。实际上我看到有说法“haskell 自己就是一种 lisp”。
我希望在写完代码以后根据需求选择检查工具看看可能有什么漏洞,不想在写代码之前先读书。
3 、rust 和 ocaml 我了解的都非常少,但是对于一些所谓“由语言带来的特性”,我的观点同上。

总结:lisp 其实有一个不可替代的地方,就是它是存活到现在的第二古老的计算机语言(第一似乎是 fortran )。这意味着它和计算机语言学的前半生是纠结在一起的,你想要什么样的东西都几乎可以不受到语法的限制(因为约等于没有语法,笑)快速实现。而剥去语法的外衣,我可以直接看到 C (仅对于 chez scheme ),可以直接看到逻辑表达式。
gowl
2023-01-24 21:28:09 +08:00
Clojure 是动态类型语言。
ufo5260987423
2023-01-24 21:36:46 +08:00
@gowl 哈哈哈哈,是嘛……我基本上只有十年前玩过 clojure
gowl
2023-01-24 21:41:22 +08:00
我自己的体会是 Scheme 程序一写大了,需要重构或者替换某些数据结果的时候就会感到力不从心。不过楼主的 LSP 应该可以提高 Scheme 的使用体验。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/910417

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX