V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ufo5260987423
V2EX  ›  Visual Studio Code

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

  •  2
     
  •   ufo5260987423 ·
    ufo5260987423 · 6 天前 · 1505 次点击

    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 版本,通过多线程加速了代码索引过程。

    28 条回复    2023-01-25 21:02:13 +08:00
    BBCCBB
        1
    BBCCBB  
       6 天前
    Chez Scheme 真的是最吊的吗
    enchilada2020
        2
    enchilada2020  
       6 天前 via Android
    cool 不过找半天发现没贴地址
    https://github.com/ufo5260987423/scheme-langserver
    ufo5260987423
        3
    ufo5260987423  
    OP
       6 天前
    @enchilada2020 哈哈,感谢。
    ufo5260987423
        4
    ufo5260987423  
    OP
       6 天前
    @BBCCBB 其实也要看情况,比如 Chez 的 String 实现效率貌似就不是很高。
    zhizunzz
        5
    zhizunzz  
       6 天前
    本人由于太菜而问不出问题, star+1
    ufo5260987423
        6
    ufo5260987423  
    OP
       6 天前
    @zhizunzz 也欢迎问一些关于解释器的其他问题啦。
    ufo5260987423
        8
    ufo5260987423  
    OP
       6 天前
    @gowl 噗,我一直不太想当地球人。
    gowl
        9
    gowl  
       6 天前
    @ufo5260987423 因为地球人好战么?
    ufo5260987423
        10
    ufo5260987423  
    OP
       6 天前
    @gowl 因为这样我处理地球人的时候就不用太有心理压力了 2333
    gowl
        11
    gowl  
       6 天前
    😂
    ksco
        12
    ksco  
       6 天前
    楼主是怎么学习 Scheme 的呀
    ufo5260987423
        13
    ufo5260987423  
    OP
       6 天前   ❤️ 1
    @ksco 大概十年前就开始搞一些 lisp 的方言,比如 clojure 。不过正经搞也就是去年 7 月份的事情(你可以去看一下 scheme-langserver 的提交记录)。
    实际上我基本上是拿 chez scheme 当 C 语言那么写,基本上写一下就会发现,你能写出来代码和会不会用 lisp 的高级特性无关。
    当然入门写 scheme 其实不太友好,因为各种现代工具太少了,我写 scheme-langserver 也是希望大家都来玩 scheme 。
    zhuangzhuang1988
        14
    zhuangzhuang1988  
       6 天前
    每次打一个字就整体 parser 一遍么?
    ufo5260987423
        15
    ufo5260987423  
    OP
       6 天前
    @zhuangzhuang1988
    1 、不是 parse ,而是更新 index 。因为 lsp 面对的很多代码可能是无法很好的 parse 的。
    2 、更新的 scope 是文件级别的。因为 lisp 的控制过于灵活,很多情况下你更新一个字(比如一个左括号)都会导致语义的重大区别(但是仍然有 define-top-level-value 这种鬼畜的东西存在);理想的更新当然是只更新牵涉更改的 index ,但是这肯定是很靠后的事情了;
    3 、目前更新索引对使用的影响还马马虎虎能够接受,so……
    当然了,有好的想法的话希望可以讨论一下。O(∩_∩)O 谢谢
    gowl
        16
    gowl  
       5 天前
    楼主写 Lisp 这么多年头儿,有没有体会到哪些 Lisp (尤其是 Scheme )的优势在实际使用中别的的函数式语言(尤其是静态类型的函数式语言)不可替代的地方呢?
    ufo5260987423
        17
    ufo5260987423  
    OP
       5 天前   ❤️ 1
    @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
        18
    gowl  
       5 天前
    Clojure 是动态类型语言。
    ufo5260987423
        19
    ufo5260987423  
    OP
       5 天前
    @gowl 哈哈哈哈,是嘛……我基本上只有十年前玩过 clojure
    gowl
        20
    gowl  
       5 天前
    我自己的体会是 Scheme 程序一写大了,需要重构或者替换某些数据结果的时候就会感到力不从心。不过楼主的 LSP 应该可以提高 Scheme 的使用体验。
    ufo5260987423
        21
    ufo5260987423  
    OP
       5 天前
    @gowl 你的写大了,大概是多大的量?
    可以交流一下你的 case ,我针对性写一下代码。
    ufo5260987423
        22
    ufo5260987423  
    OP
       5 天前
    @gowl 我突然想到一点 scheme 的绝对优势:肯定不会学 python 新标准把旧标准完全抛弃哈哈哈哈
    gowl
        23
    gowl  
       5 天前
    > 你的写大了,大概是多大的量?

    不算测试,一千行左右。如果是 Java 的话不算什么,但 Scheme 这种语义密度很高的一千行的程序就不小了。

    > 肯定不会学 python 新标准把旧标准完全抛弃哈哈哈哈

    不要和 Python 比:)

    @ufo5260987423
    mascteen
        24
    mascteen  
       5 天前 via Android
    lisp 的强大毋庸置疑,所以方言非常多也各有特色,但我更顷向于统一标准的 common lisp,一是因为标准是固定的几乎不会改变,二是学习资料的完配三是友好的社区氛围,你是怎么认为的呢?
    ufo5260987423
        25
    ufo5260987423  
    OP
       5 天前
    @gowl 正如你所说,语义密度 scheme 太高了。scheme-langserver 表现怎么样,这种时候就看你如何在文件层面分割了。
    ufo5260987423
        26
    ufo5260987423  
    OP
       5 天前
    @mascteen 我当年也跟着田春冰河的足迹学过一些 common lisp 。我不是很熟悉现在的 cl 实践,但是正如我上面所说的:我需要一门足够简单的语言,然后根据自己的需求通过加库的方式激活一些特性。这方面 scheme 已经满足需求了。或者这么说吧(肯定不精确),我需要 c ,但是不需要 c++。
    pisc
        27
    pisc  
       5 天前
    @ufo5260987423

    > 它是一个 prover ,用各种数学证明保证你是正确的。
    狭义上,Haskell 并不算 Prover (如 Coq/HOL/Idris 之类的),广义上(根据 CH 同构),任何静态语言都可以是 Prover 。

    > (Haskell)不想在写代码之前先读书。
    实际上,工程化的很多 Haskell 都写的非常简单,很多人都当作 C 来写,只不过很多人容易被一些“概念”引到另一条路上。
    ufo5260987423
        28
    ufo5260987423  
    OP
       4 天前
    @pisc 嗯呢,我对 haskell 只有一个印象,并没有使用过。也看不太懂 haskell 社区讨论的太多东西,感觉有很多学术内容。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   1692 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 12:17 · PVG 20:17 · LAX 04:17 · JFK 07:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.