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 版本,通过多线程加速了代码索引过程。
1
BBCCBB 2023-01-24 11:00:10 +08:00
Chez Scheme 真的是最吊的吗
|
2
enchilada2020 2023-01-24 11:08:53 +08:00 via Android
cool 不过找半天发现没贴地址
https://github.com/ufo5260987423/scheme-langserver |
3
ufo5260987423 OP @enchilada2020 哈哈,感谢。
|
4
ufo5260987423 OP @BBCCBB 其实也要看情况,比如 Chez 的 String 实现效率貌似就不是很高。
|
5
zhizunzz 2023-01-24 11:24:41 +08:00
本人由于太菜而问不出问题, star+1
|
6
ufo5260987423 OP @zhizunzz 也欢迎问一些关于解释器的其他问题啦。
|
7
gowl 2023-01-24 13:42:21 +08:00
|
8
ufo5260987423 OP @gowl 噗,我一直不太想当地球人。
|
9
gowl 2023-01-24 14:20:16 +08:00
@ufo5260987423 因为地球人好战么?
|
10
ufo5260987423 OP @gowl 因为这样我处理地球人的时候就不用太有心理压力了 2333
|
11
gowl 2023-01-24 14:40:58 +08:00
😂
|
12
ksco 2023-01-24 15:18:57 +08:00
楼主是怎么学习 Scheme 的呀
|
13
ufo5260987423 OP @ksco 大概十年前就开始搞一些 lisp 的方言,比如 clojure 。不过正经搞也就是去年 7 月份的事情(你可以去看一下 scheme-langserver 的提交记录)。
实际上我基本上是拿 chez scheme 当 C 语言那么写,基本上写一下就会发现,你能写出来代码和会不会用 lisp 的高级特性无关。 当然入门写 scheme 其实不太友好,因为各种现代工具太少了,我写 scheme-langserver 也是希望大家都来玩 scheme 。 |
14
zhuangzhuang1988 2023-01-24 19:48:34 +08:00
每次打一个字就整体 parser 一遍么?
|
15
ufo5260987423 OP @zhuangzhuang1988
1 、不是 parse ,而是更新 index 。因为 lsp 面对的很多代码可能是无法很好的 parse 的。 2 、更新的 scope 是文件级别的。因为 lisp 的控制过于灵活,很多情况下你更新一个字(比如一个左括号)都会导致语义的重大区别(但是仍然有 define-top-level-value 这种鬼畜的东西存在);理想的更新当然是只更新牵涉更改的 index ,但是这肯定是很靠后的事情了; 3 、目前更新索引对使用的影响还马马虎虎能够接受,so…… 当然了,有好的想法的话希望可以讨论一下。O(∩_∩)O 谢谢 |
16
gowl 2023-01-24 20:23:21 +08:00
楼主写 Lisp 这么多年头儿,有没有体会到哪些 Lisp (尤其是 Scheme )的优势在实际使用中别的的函数式语言(尤其是静态类型的函数式语言)不可替代的地方呢?
|
17
ufo5260987423 OP @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 ),可以直接看到逻辑表达式。 |
18
gowl 2023-01-24 21:28:09 +08:00
Clojure 是动态类型语言。
|
19
ufo5260987423 OP @gowl 哈哈哈哈,是嘛……我基本上只有十年前玩过 clojure
|
20
gowl 2023-01-24 21:41:22 +08:00
我自己的体会是 Scheme 程序一写大了,需要重构或者替换某些数据结果的时候就会感到力不从心。不过楼主的 LSP 应该可以提高 Scheme 的使用体验。
|
21
ufo5260987423 OP @gowl 你的写大了,大概是多大的量?
可以交流一下你的 case ,我针对性写一下代码。 |
22
ufo5260987423 OP @gowl 我突然想到一点 scheme 的绝对优势:肯定不会学 python 新标准把旧标准完全抛弃哈哈哈哈
|
23
gowl 2023-01-24 22:53:44 +08:00
> 你的写大了,大概是多大的量?
不算测试,一千行左右。如果是 Java 的话不算什么,但 Scheme 这种语义密度很高的一千行的程序就不小了。 > 肯定不会学 python 新标准把旧标准完全抛弃哈哈哈哈 不要和 Python 比:) @ufo5260987423 |
24
mascteen 2023-01-24 23:47:44 +08:00 via Android
lisp 的强大毋庸置疑,所以方言非常多也各有特色,但我更顷向于统一标准的 common lisp,一是因为标准是固定的几乎不会改变,二是学习资料的完配三是友好的社区氛围,你是怎么认为的呢?
|
25
ufo5260987423 OP @gowl 正如你所说,语义密度 scheme 太高了。scheme-langserver 表现怎么样,这种时候就看你如何在文件层面分割了。
|
26
ufo5260987423 OP @mascteen 我当年也跟着田春冰河的足迹学过一些 common lisp 。我不是很熟悉现在的 cl 实践,但是正如我上面所说的:我需要一门足够简单的语言,然后根据自己的需求通过加库的方式激活一些特性。这方面 scheme 已经满足需求了。或者这么说吧(肯定不精确),我需要 c ,但是不需要 c++。
|
27
pisc 2023-01-25 10:02:30 +08:00
@ufo5260987423
> 它是一个 prover ,用各种数学证明保证你是正确的。 狭义上,Haskell 并不算 Prover (如 Coq/HOL/Idris 之类的),广义上(根据 CH 同构),任何静态语言都可以是 Prover 。 > (Haskell)不想在写代码之前先读书。 实际上,工程化的很多 Haskell 都写的非常简单,很多人都当作 C 来写,只不过很多人容易被一些“概念”引到另一条路上。 |
28
ufo5260987423 OP @pisc 嗯呢,我对 haskell 只有一个印象,并没有使用过。也看不太懂 haskell 社区讨论的太多东西,感觉有很多学术内容。
|
29
ufo5260987423 OP @zhuangzhuang1988 #14 scheme-langserver 的上一个版本修改了逻辑,就是用户更新代码的时候先暂存更新操作,到用户需要 autocomplete 或者什么其他别的功能的时候,再去更新 index 。
|