哪种 lisp 语言更适合用来当作脚本语言?

我有一些简单的工作可以通过脚本完成,例如通过 python 内置的 urllib 库获取网站最新内容,经过简单文本处理后更新到本地文件、本地图片根据时间重命名等等

最近想要使用 lisp 来实现这些功能,于是我一开始考虑使用 common lisp 实现,但是遇到了这样的问题:

  1. 内置库太少,如果我要进行网络请求,就需要先安装 quicklisp,再利用 quicklisp 安装所需的库,这些步骤下来,不像 python 一样能开箱即用
  2. 对命令行参数的支持不同实现不一致,像 sbcl 用的是 sb-ext:*posix-argv*、clozure 用的 ccl:*unprocessed-command-line-arguments*,还有别的茫茫多实现;虽然有个 (uiop:command-line-arguments) 但解析起来还是遇到了第一条的局限

于是我又考虑换个 lisp:

  1. racket 语法跟 scheme 一样简洁,内置库也多,但是 Windows 下执行有问题
  2. clojure 内置库多,但是你懂的,它是 java 系,虽然有 graalvm 版本但心里还是更偏向纯 lisp 一点,这算是我的最终无奈选择。。。

不知道坛友有没有过和我一样想法,并最终实现了的,希望大家不吝赐教 :grin:

这不就是我正在做的事情么!

可以来参与Goldfish Scheme的开发!

推荐 hylang,在 python 上实现的 lisp,本质上是把 lisp 文件读取成内部的 hy model 对象,然后在 hy model 上进行宏展开并编译成 python ast。 每个 python ast 类型都有对应的 special form,所以理论上和 python 完全兼容。 hy 库加载时注册了 hy 后缀加载器,所以在 import hy 之后可以像引入 py 文件一样引入 hy 文件、生成 pyc 缓存。

就作为脚本语言来说,hylang 可以和 python 无损对接,有 python 的方便性和生态,是最合适的。 用 clojure 写脚本就是 bb(babashka)了,bb 自带了一些库,但是个人感觉无论功能还是易用性上都不如 python 自带的库,而且要引入第三方库就要新建项目写 bb.edn, 感觉还不如直接写一个普通的 clojure 项目然后 lein run,很不方便,基本上只有在 clojure 项目里实现简单的功能才会用。

1 个赞

https://fennel-lang.org/

https://clasp-developers.github.io/

https://gerbil.scheme.org/

https://cisco.github.io/ChezScheme/

3 个赞

为啥都不考虑GNU钦定的 guile scheme?

graalvm 可用性高吗?想试试用 Scala 了 等等,所谓的 graalvm 版不会就是把 Clojure runtime+解释器编译了不用装 JVM 吧?

类似的工作如果是在 Linux/Mac 上我会用 Emacs。Windows 的话,其实 elvish shell 语法上勉強能算 lisp。

用 Common Lisp 的 dump image 功能,只要不用 ffi 什么都可以 dump 进去。Common Lisp 在 Windows 上是绿色软件,要利用好这个优势

自用的脚本没必要追求可移植性,另外见上一条,可以 dump 一个 argparse 库进去

$ put (* 2.5 (+ 1 2.2))
▶ (num 8.0)

@sadhen 支持用 MSVC 构建吗?

1 个赞

Emacs 里面什么方式使用hylang 比较好?看hy-mode已经很久没更新了

绿色是指直接解压运行的那种软件吗?

Python 就要装 Installer,对吧。说实话这个安装器在我编译 LLVM+CCLS 的时候硌应了好久,本来装 MSVC 就够那啥了

没有原生支持 Windows

我是编程苦手,利用编程语言实现功能还好,造一门语言来满足功能目前对我来说还是太难了,感谢推荐

clojure 最近也出了一门方言 basilisp 把 clojure 代码翻译成 python 来着,hylang 给我的感觉也跟它一样,不够纯粹(不过既然要用 lisp 还要考虑基础库足够,或者就不应该这么洁癖了 :joy:

想想我本身的脚本就是用 python 写的,转成 hy 倒也不错,后面会看一下的

我是编程苦手,利用编程语言实现功能还好,造一门语言来满足功能目前对我来说还是太难了,感谢推荐

我也是,我的关注点在标准库。其实也还是利用编程语言实现功能。

是的,我想表达的正是这个意思。。我单纯是不想运行脚本再启动一个 jvm 而已

也是,elisp 是一个思路,我下意识只把 elisp 当成 emacs 的配置语言了。。。现在想想我 emacs 装的库也不少,应该能实现我的这些任务

image 的话,实际上就是个二进制文件吧,这种情况下我通过 git 管理脚本文件是不是就不太方便?


感觉像是个不可能三角 纯粹 - 易用 - 好管理

janet ?

不太清楚 Portacle 和 Lispstick! 算不算,不过这两个算是 Windows 上比较方便的开发环境。

http://www.iqool.de/lispstick.html

Goldfish Scheme支持MSVC,不支持Mingw。

我用 hylang 写过很多项目,都是用的官方的那个很久没更新的 hy-mode,高亮和缩进虽然有些问题但还是能用的。 REPL 没有用 hy-mode 自带的 hy-shell,我自己实现的集成 python-shell,和 ipython 配合使用。 语法补全约等于没有,纯手敲。

我自己也写了一个简单的主模式,可以替代官方的 hy-mode 或者单独取其中的 python-shell 集成代码和官方的 hy-mode 一起用。

1 个赞

dump image 的时候有没有什么压缩的好方法呢? (虽然储存空间挺便宜的就是了)

我目前的做法是后台运行 SBCL 然后用 SLY 连接进去, 要写什么脚本就新开一个 package (因为有一堆自己的代码的积累, 写起新功能来也还算方便?), 相当于是把 lisp 作为一个启动器和数据处理工具来用. 缺点就是不方便随时保存 image, 尤其是新开 SBCL 的时候分的动态空间比较小的时候, 往往会出现读的文件太多把 GC 给爆了而丢失当前的环境.

貌似之前还在论坛里看过 lisp 写的 shell?

有提供压缩的参数。

然后,不要从 sly save image,会把标准输入输出变量搞坏。写个 lisp 文件从 terminal 运行。

从 SLY save image 的话应该会遇到 save-with-multiple-threads-error (应该可以用 trivial-dump-core, 但是没有尝试过).

不过 sly 会把标准输入输出搞坏确实长知识了.