寻找(mini-languages)的(c)lisp示例,即领域特定语言(DSLs)的示例。

7
阅读写得好的代码似乎有助于我学习一门语言。(至少在C语言方面是这样。) 我特别关注Lisp作为一种适合创建针对特定问题的迷你语言或DSL的语言的声誉。 当然,该程序应该是开源的,并且最好可以通过网络获得。 我已经通过Google找到了一个例子:http://lispm.dyndns.org/news?ID=NEWS-2005-07-08-1。 还有其他的例子吗?(是的,我将继续阅读《实用公共Lisp》)。 11个小时后 (仅仅11个小时!):谢谢大家。这是一个多么美妙的网站,也是一堆好答案和技巧!

为了避免混淆:Lisp是一组编程语言。Common Lisp(或简称CL)是Lisp的一个方言。CLISP是Common Lisp的一个特定实现(其他实现包括CCL、GCL、SBCL、LispWorks、ACL等)。 - Rainer Joswig
7个回答

7

我认为你的限制过于严格:

足够小以便理解,足够多样化以展示大部分(c)lisp的技巧和特性而不会变得晦涩难懂(愿望中的“写得好”的部分),并且独立于其他包。

Common Lisp是一种庞大的语言,当您组合语言元素时出现的能力集要大得多。您无法在CL中编写一个显示“大多数技巧”的小程序。

当您从另一种语言学习CL时,您还会发现许多概念很陌生。因此,CL不是关于技巧,而更多地涉及其基本范例。

我的建议是先阅读一些相关资料,然后开始构建自己的程序或查看开源代码。

例如,Edi Weitz通常编写良好的代码。请查看他在http://www.weitz.de/上的项目。

现在去阅读PCL吧。 :)


啊,那么,这就是答案了。除了教科书和Weitz网站(非常感谢),您有什么其他推荐吗?请记住,我正在寻找一种迷你语言类型的应用程序示例,但独立于软件包。或者看看开源代码也可以。 - behindthefall
这里是一个简单的布尔语言用于搜索引擎:http://xach.livejournal.com/131456.html(尽管它没有使用宏)。cl-cairo2有一些宏示例,形成了微小的DSL(grep for defmacro)。fare-matcher有一个DSL用于定义特定的匹配器(define-*-matcher)。迭代库(以及LOOP实现)都是编写灵活循环的复杂DSL的示例。usocket有另一个微小的DSL,可以抽象掉套接字设置/拆除的细节(例如WITH-CLIENT-SOCKET)。通过适当的clbuild检查进行grep将显示更多内容。 - Leslie P. Polzer
谢谢。我会很容易地找到“迭代库”的代码吗?这听起来像是“用语言扩展语言”的典型例子,最近我在想是否应该满足于Python的唯一和基本的“while”结构。 - behindthefall
这是你所提到的“迭代库”代码吗?http://common-lisp.net/project/iterate/darcs/iterate/iterate.lisp嗯,好棒。 - behindthefall

6
我有点懒得去找链接,但你应该能够通过'Google'/'Bing'找到。以下列表介绍了非常不同的嵌入语言和不同的嵌入式语言。
- ITERATE用于迭代 - 在“defsystem”中的System/Module/File描述,例如ASDF - 中缀读取宏 - CLIM中的define-application-frame用于指定用户界面 - LispWorks和CLSQL中的嵌入式Lisp化SQL查询 - LispWorks的Knowledgeworks:具有规则、查询等逻辑语言 - Allegro CL中嵌入的Prolog - 各种形式的嵌入式HTML - XMLisp,集成XML和Lisp - 用于非确定性编程的Screamer - 用于组合音乐的可视化编程PWGL
请注意,存在简单嵌入语言和复杂嵌入语言,这些语言提供了全新的范例,如Prolog、Screamer、CORBA等。

5
如果你还没有看过的话,书籍《实用Common Lisp》可以在网上免费阅读,并且有几个示例项目。

同意,这是一本非常棒的Lisp书籍。 - HappyCodeMonkey
是的,我本周下载了它,但还没有深入研究。我想到有人可能知道一些从另一个角度来看待问题的程序,比如“工作代码”和“教学代码”的区别。 - behindthefall
2
PCL中的代码具有实际价值。 - Leslie P. Polzer
我已经有点老了,学习一个新的编辑器对我来说有些困难。多年来我一直使用gvim而不是emacs。此外,在cygwin下使用clisp感觉很熟悉和方便。结果发现这本书要求我从emacs IDE中运行Allegro,但由于安装/更新问题(感谢WinXP),出现了一些问题。这张图片有些不对劲... - behindthefall
我整天都在使用 Vim 和控制台(SBCL w/ rlwrap 和 SB-ACLREPL)。 - Leslie P. Polzer
你(或其他人)是否发布了如何启动和运行该安排的说明?它是可以在cygwin下设置的吗?(我也在窗口中运行vim,并使用shell窗口来调用以前的命令并重新运行我正在处理的任何内容,这些天主要是Python中的谜题解决者。曾经在Sun和SGI上使用C和Tcl进行图像分析。) - behindthefall

4

LOOP宏是Common Lisp中嵌入式DSL的一个几乎完美的例子。然而,由于它已经成为标准的一部分,可能不是你想要的。


4

CL的格式化函数有一个微型DSL。

http://cybertiggyr.com/fmt/

我认为用于打印字符串的DSL将会被编译为机器码。

(format nil "~{~A~#[~:;, ~]~}" lst))


2
CLSQL为SQL查询提供了Lispy符号表示法,它将其编译为SQL,几乎所有的Lisp HTML和XML生成库都符合要求。Metabang bind是一个用于词法绑定变量的DSL。你可能不知道你需要它,但事实证明它非常有用。

0

SERIES算是一种DSL,根据你的定义。它在CLTL2的附录中,但实际上并不是语言的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接