2020年Lisp常见生态系统状况

2021-02-09 20:29:47

这是从用户和贡献者的角度对截至2021年1月的Common Lisp生态系统的描述。

本文的目的是概述生态系统,并帮助推动每个领域的整合。

每个应用程序领域都有有关整合生态系统那部分的建议,以及一些有趣的未来工作的指针。

本文来自费南多·波雷蒂(Fernando Borretti)自2015年以来的“普通Lisp生态系统状况”,因此引言听起来很熟悉。这一新内容将是一个机会,探讨取得的成就或仍然缺乏的东西。

免责声明:本文不是最近几年出现的每个项目或感兴趣的文章的列表。我在这里写下了更接近该目标的2018年概述。可以在Awesome-cl列表,GitHub和Cliki上找到更多库。

过去曾经有几种选择可以简化命令行程序的构建和分发,但是现在罗斯维尔获得了最大的发展,这是一件好事。 Roswell是实现管理器,安装程序和脚本运行器,它的主要功能之一是支持非常容易地将微小的脚本编译为可执行文件。

现在,GNU Guix已获得许多CL库,并成为Roswell的竞争者。 Guix可以用作Unix发行版上的软件包管理器。它带来可复制的构建,回滚,安装任何库的精确版本(包括系统依赖项),所包含的环境和用户配置文件的能力。安装最新版本的CL实现和库,并在一定程度上共享脚本也很容易。请参阅文章A Lisp REPL作为我的主要观点。

为了解析命令行参数,unix-opts显示了不错的活动。提醒一下,CLI参数可移植地存储在uiop:command-line-arguments中。

Lem编辑器使用cl-charms库在ncurses之上构建了一个很棒的用户界面和REPL。重用其组件将非常有用,这样Lispers可以轻松构建类似的基于丰富终端的界面。

Mito是用于Common Lisp的ORM,具有迁移,关系和PostgreSQL支持。它基于cl-dbi(到各种数据库服务器特定的库(例如cl-postgres和cl-mysql)的统一接口)和SxQL(用于构建安全的,自动参数化的SQL查询的DSL)。

当然,该领域还有更多的图书馆。自2015年以来的一些新功能包括:

cl-yesql(Serapeum,Spinneret和其他出色的库的作者)基于Clojure的Yesql。

vivace-graph是一个graph数据库和Prolog实现,采用了来自CouchDB,neo4j和AllegroGraph的设计和灵感。

Rutils,《 Programming Algorithmsbook》和其他库的作者Vsevolod Dyomkin正在编写cl-agraph,这是Franz Inc. AllegroGraph的最小客户端。 AllegroGraph是一种“水平分布的多模型(文档和图形)实体事件知识图技术”。它是专有的,具有免费版本,限制为500万个三元组。当然,我们应该更多地了解Lisp隐藏的宝石之一。

缺乏通用的迁移工具。现在,我们有了cl-migratum,这是“提供用于执行数据库模式迁移的工具的系统,旨在与各种数据库一起使用”。

在新兴的ORM中,Mito是Lispers似乎积极选择的一种。好。 CLSQL当然仍然可以运行,但是我们没有听说过,它看起来已经过时了。所以,美图。

Mito有11位贡献者,并且受到关注,但它可能还应该有其他核心维护者。

去年,Manfred Bergmann开发了cl-gserver。这是一个“消息传递”库/框架,其中的参与者类似于Erlang或Akka。这是一项重要的成就。

参与者可以使用消息调度程序的共享池,从而有效地创建数百万个参与者。

创建角色层次结构的可能性。演员可以有儿童演员。现在,演员也可以“监视”另一个演员以获取有关其终止的通知。

calispel-常见Lisp的类似CSP的频道。使用阻塞功能时,可以选择缓冲的通道和“ CSP select”语句。 ISC样式。 “它是完整,灵活且易于使用的。我会推荐Calispel而不是Lparallel和ChanL。” @Ambrevar。讨论区

trivial-monitored-thread-一个普通的Lisp库,提供了一种生成线程的方式,当其中任何一个崩溃并死掉时会通知该线程。

cl-gearman-Gearman分布式作业系统的库。亚历山大·阿特缅科(Alexander Artemenko)用它代替了Ultralisp的lfarm:https://40ants.com/lisp-project-of-the-day/2020/06/0095-cl-gearman.html,因为“ lfarm不太适合以下环境工人主人可以下楼,稍后再回来。”

Bordeaux-Threads是“事实上的”库,但是Lparallel,Calispel,Bordeaux-Threads和SBCL的contribs之间存在一些选择瘫痪。在野外使用这些库并编写它们。

JSON:Jonathan,cl-json或更多。使用实用程序:json-mop-用于桥接CLOS和JSON对象的元类(提醒JSON库已经可以序列化您自己的对象)。

Jonathan于2015年推出,现在已成为易于使用和快速JSON编码器和解码器的不错的首选。

它们都以不同的方式表示空值。我们需要一个“做正确的事”的图书馆。看到庞大的网络工具包进行JSON处理了吗?

它将Lisp的NIL与null,false和[]区分开,因此支持JSON值之间的相同转换。它提供了对象构造函数和访问器来构建和访问嵌套JSON对象。

一个YAML解析器,使cl-yaml不依赖libyaml库将使分发更加简单。

Common Lisp领域的一个常见抱怨是缺少完整的跨平台GUI解决方案。 Ltk是一个非常好的库,但是Tk是有限的。 Qtools很棒,但仅适用于Qt4。

已经发生了很多事情,并且仍在发生(如果您观看正确的存储库,就会知道Qt5包装器正在开发中(ECL已经具有Qt5绑定:EQL5,带有Android端口))。

马修·肯尼迪(Matthew Kennedy)向IUP便携式用户界面库IUP编写了出色的FFI绑定。 IUP是跨平台的(Windows,macOS,GNU / Linux,带有新的Android,iOS,Cocoa和Web Assembly驱动程序),具有许多小部件(但少于Qt),具有小的API并正在积极开发。 IUP是在里约热内卢PUC大学创建的。

Nicolas Hafner创立了Alloy,这是一种新的用户界面协议和工具包实现,可在他的Kandria游戏中使用。

CLOG使用Web技术为本地或远程应用程序生成图形用户界面。 CLOG可以代替大多数跨平台的GUI框架和网站框架,或与之协同工作。 CLOG软件包启动与浏览器或其他Websocket客户端(通常是嵌入在本机模板应用程序中的浏览器)的连接。

还有更多的GUI库和框架:https://github.com/CodyReichert/awesome-cl#Gui(还有更多正在开发中的)。特别是,LispWorks的CAPI仍然被尝试过的人评为全市最佳。

自2020年10月左右以来,尼古拉斯·哈夫纳(Nicolas Hafner)在坎德里亚(Kandria)全职工作。通过GitHubsponsors或ko-fi支持他的工作将是1)受到认可的好兆头和2)对生态系统(特别是对Alloy)有用。

我在《食谱》中对这些框架进行了介绍:Cookbook / gui。欢迎更多示例或演示项目。

有两个主动维护的GTK绑定的分支叉。需要统一努力。

使用IUP /您选择的日常工具包编写一个桌面应用程序,使其成为Common Lisp旗舰产品。

研究其他GUI绑定方法。 gtk服务器呢? GObject内省?开始为Qt:giqt(我们从Nyxtbrowser中识别@ambrevar)开始努力。

mgl-mat-用于处理多维数组的库,它支持与外部代码和CUDA代码的有效接口。 BLAS和CUBLAS绑定可用。

Antik-Common Lisp中科学和工程计算的基础。它的设计不仅方便数值计算,而且还允许使用数值计算库以及数据和程序的交换,无论是外部(非Lisp)库还是Lisp库。

ASDF的可移植兼容性层UIOP包含大量工具,可移植地执行从查询主机名到运行外部程序再到处理环境变量的所有操作。

我们不再需要cl-fad(但是我们需要Osicat,与UIOP不同,它是POSIX友好的)。

保罗·M·罗德里格斯(Paul M. Rodriguez)的cmd建立在UIOP的基础上,它引入了一些简便的助手来运行和管道程序。

Lisp的主要Web服务器是Hunchentoot和Clack。自2015年以来,Clack的文档状态几乎没有改善,现在仍然缺乏。

Clack与WSGI / Rack等效。它自2009年以来就已经存在。它是HTTP服务器的抽象,允许用户编写Web应用程序(或更合理地说,Web应用程序框架)而无需依赖特定的服务器。一些Web框架是基于它构建的,例如Caveman2。

使用Clack的重要性不可低估:如果直接在Hunchentoot上构建应用程序,则与Hunchentoot息息相关,并且如果出现了新的更快的服务器(如Woo),则必须将整个应用程序重写为用它。如果您为Clack编写插件(例如clack-errors),则该插件可以在所有基于Clack的应用程序中自动使用,无论其框架如何,从而减少了无用的代码重复。

使用Clack,从Hunchentoot切换到Woo,并享受令人难以置信的加速,这是安装libev和更改关键字参数的简单问题。

这仍然成立,但情况并没有太大改善。相比之下,Hunchentoot的文档记录非常好(您可以在此处阅读更好看的readthedocs来阅读其文档),而且它“足够快”。

关于Hunchentoot:Mariano Montone在Hunchentoot之上编写了简单路线,这是一个有点方便的路线处理工具。带来:

为Clack写更多文档。虽然Lispers知道它,但由于缺乏文档,他们不一定采用它。我们可以扩展此入门指南。

存在许多HTML生成器和模板库(请参见下面的列表)。但是,最近出现了一些新的和好的:

Djula的维护者TEN带来了Djula的完善性和Eco的可用性(由Fernando Borretti提供),又名:您编写了类似Django的HTML模板,但是您可以插入任何Lisp代码。

标记-一个类似JSX的模板引擎,其中HTML标记是Common Lisp代码。带有Emacs软件包。

我们还有其他不错的构建块,例如不错的表单处理库(cl-forms)和用于创建Open-API接口的库。集成的,自以为是的一体化解决方案可能会提高生产力。

基础已经完成,现在是时候编写更高层次的图层了。一个适用于Clack应用程序的可扩展管理框架,例如Django的Admin,将是一个很好的例子。

JSCL是一种从CL到JS的编译器,旨在从第一天开始就可以自我托管。 JSCL尚不完整(尚未),它缺少CLOS,格式和循环。

帮助开发现有的CL-to-JS实现之一。为什么不看看JSCL的问题?

为ParenScript带来新的JavaScript习惯用法,为ParenScript带来一些新的宏。例如,允许编写异步并等待。

Weblocks是一个已经很老的框架,它允许编写动态Web应用程序而无需编写JavaScript(它不像modernJS框架那样动态,没有“双重数据绑定”)。其基于服务器的组件使用Ajax(如果可用)或回退到纯HTTP并更新DOM。这是Smalltalk海边的框架。

Weblocks变老了,没有维护,但是Alexander Artemenko在其Reblocks分支中对其进行了很大的更新和重构。他将其用于Ultralisp网站和更多应用程序。您可以在Gitter上与用户和开发人员联系。

最近,出现了一个非常新的Web框架:ISSR,用于InteractiveServer-Side渲染。它通过websocket连接将客户端链接到服务器,并有选择地更新DOM。因此,它不同于Phoenix的LiveView或Hotwire。

复兴Weblocks并发布CLOG和ISSR是巨大的成就。但是,开始创建围绕他们的用户社区的工作才开始。

April将APL编程语言(其子集)引入了Common Lisp。用一行APL替换数百行数字转换代码。

我们有CFFI(用于CL的便携式外来函数接口),C2FFI(基于Clang的FFI包装生成器),然后是cl-autowrap,这是基于c2ffi的包装生成器,可快速创建C绑定。

Pavel Korolev正在开发CLAW,它最初是cl-autowrap的分支,它带来了C ++支持。为了练习,他生成了与GLM或Filament渲染引擎的绑定。

当CLAW正式准备使用时,这将是一个巨大的成就。事实并非如此(尽管GLM绑定基本上在Android上打招呼,这本身就是一个成就)。

我没有在CL上重写整个Clojure语言,而是将ABCL嵌入Clojure中。由于两者都是用Java实现的,而Clojure具有出色的Java互操作性,因此很容易在ABCL Common Lisp环境上具有完全访问权限。这样,我们就完全支持Clojure和Common Lisp。

我希望看到Clojure和Common Lisp相互配合的原因是要在Clojure上使用CL程序/库,尤其是Maxima和ACL2。由于ABCL已经可以编译并运行Maxima,因此应该可以,但是我们离它很远🤷。

还有其他尝试缩短Clojure与常见Lisp之间的差距的尝试,例如Cloture和clclojure。一旦完成,Clojure将受益于本机二进制文件和SBCL等出色的编译器,但是还远远不够。

关于该主题,请参见艾伦·迪珀特(Alan Dipert)的演讲:“好奇的Clojurian的共同Lisp”。

“如果我不得不被Clojure之外的其他事物所困扰,那么拥有良好的Common Lisp及其源代码将是我最高兴的事情。” -Rich Hickey,2011年

Common Lisp(CL)和Clojure都是Lisp的方言。 Clojure的创建者Rich Hickey在创建Clojure之前学习了CL并专业地使用了它。

Clojure可以做什么CL无法做到的,反之亦然?当Clojure和ClojureScript都存在时,为什么今天有人会使用CL?

在本次演讲中,我将尝试从长期对Clojurian寄予厚望的Clojurian的角度回答这些问题以及更多问题。

py4cl是该镇中的新库。它允许Common Lisp代码访问Python库。它基本上是cl4py的反函数。

另请参见异步过程,以及在进行同步时,我对Python VS CommonLisp的比较,其中我们研究了工作流和生态系统的差异。

改进诸如Numcl(一个Numpy克隆)之类的CL库是推动Common Lisp前进的必要条件。

积极的实现包括:ABCL,CCL,CLASP,ECL,LispWorks,AllegroCL,SBCL。在一定程度上,GNU CLisp,SICL(是最新的)和Corman Lisp(Windows的CL开发环境)(在此处重新生成)。

SBCL仍按月发布。它已经20岁了,并且一直在不断改进(RISC-V端口,M1端口,块编译,更多的编译时类型检查……)。我们可以在此处阅读有关在维也纳举行的聚会的博客。您知道Google名望的Doug Katzman为SBCL做出了贡献吗?

道格·卡兹曼(Doug Katzman)谈到了他在Google的工作,以使SBCL与Unix更好地合作。对于那些不认识的人,他在过去的两年中在SBCL上做了很多工作,不仅为GC添加了许多新功能,并使它在包含异物的应用程序中更好地发挥了作用,而且还对内部进行了大量的清理工作,并帮助SBCL变得更加Sanely Bootstrappable。这是另一个话题,我希望道格或克里斯托夫有时间写下有关该过程的最新改进,因为这确实很有趣。

无论如何,Doug谈论的是他在使SBCL更适合外部调试工具(例如gdb和外部探查器)方面所做的工作。看来他们与Google的Lisp的外星人有很多交往,因此很高兴有来自外星人工具的回溯了解Lisp。事实证明,要使SBCL像这样好运行还需要做许多先决工作,包括实现一个固定的GC运行时,以便Lisp对象,尤其是Lisp代码(通常是动态空间对象,就像其他所有东西一样移动)。不能逃避外星人,并且总是有已知的位置。

在这里,也取得了很大的进步。尽管通常抱怨非Lispers是因为Emacs(和Vim)缺少编辑器支持,但现在我们几乎陷入选择瘫痪的境地:

Portacle是Emacs入门的最简单方法。它是便携式和多平台的,只需单击三下即可使用。它附带了Emacs,SBCL,Slime,Quicklisp和git。

VSCode有两个扩展:使用Language Server Protocol的commonlisp-vscode,以及使用Lisp后端(Swank)作为传统扩展的Alive,最近的扩展。

Sublime Text得到了很好的扩展:Slyblime是SLY的实现,并且使用相同的后端(SLYNK)。它具有高级功能,包括带有堆栈框架检查功能的调试器。

Lem是用Common Lisp编写的编辑器。它允许立即开始在CL中进行开发,并且支持其他语言。

Dandelion Eclipse插件被重新发现。尽管它没有其他功能丰富(例如,没有交互式调试器),但它拥有用户。它专门针对初学者。

最后但并非最不重要的一点是,如果您想在iPhone或iPad上播放,则CodePlayground应用程序通过CCL获得了Lisp支持。

SLY可能需要更多的赞美。它具有声音功能,例如SLY贴纸和新的SLY步进器。

cl-flamegraph是SBCL统计分析器的包装,可从Common Lisp程序生成FlameGraph图表。

tracer是Common Lisp的跟踪分析器,其输出适合在Chrome / Chromium的Tracing Viewer中显示。

GTFL是Lisp的图形终端,适用于想要调试或可视化自己算法的Lisp程序员。它是浏览器中的图形跟踪。

Lisp REPL核心转储器是一种便携式包装器,可根据需要生成Lisp核心,从而快速启动REPL。它可以预加载提供的系统,以帮助构建专用的Lisp内核集合。如果您习惯于在不同的环境中需要他们自己的库集,则此核心转储程序(可选地与SLY的mrepl一起使用)可以使彼此之间的切换更加轻松快捷。

Ultralisp,一种Quicklisp发行版,每5分钟生成一次。我们可以单击两次添加我们的项目。

CLPM是与Quicklisp兼容的新软件包管理器,它可以固定确切版本的依赖项,该依赖项可从命令行使用并支持HTTPS。

最后但并非最不重要的是,如前所述,许多CL库是为Guix打包的(最著名的是Nyxt的Pierre Neidhart)。

Ultralisp解决了Quicklisp的1个月发布时间表(这是一项功能,但并非所有人都喜欢),并使发布库变得简单快捷。 CLPM通过解决另一种方法来解决Quicklisp的其他限制。 两者都是伟大的成就。 Ultralisp还具有一个搜索框,可在其所有已注册库中搜索符号。 很有用。 Alexander正在努力让每个Ultralisp用户只需单击几下即可创建自己的Quicklisp发行版。 每个项目都有一个.asd文件,称为系统定义文件,该文件定义项目元数据(作者,维护者,主页等)和组件。 对我来说,这是Common Lisp的主要卖点之一。 使用Python之类的语言,每个文件都会导入所需的任何内容,并且您的项目将成为大量相互依赖文件的图形。 在ASDF中,基本上按定义顺序列出项目中的文件。 要么, ......