在哪里学习如何实际使用Common Lisp [关闭]


79

我是一名试图学习Common Lisp的C ++程序员。我看过《 Lisp之地》等书籍,并阅读了许多有关Lisp各种优点的在线文章。但是,我需要一些建议。

我所读到的有关Common Lisp的几乎所有内容都与它的惊人性,完成它的速度有多惊人以及它如何惊人地解决了30年前现代编程语言的许多问题有关。此外,还有多么惊人的宏,以及如何在Lisp中使用每个编程范例(OO,功能,基于actor的对象等等),以及列表如何成为最终的数据结构。基本上把Lisp当作一种研究语言,并说它是多么与众不同和具有革命性。

所有这些东西可能都是正确的,但是问题是我还没有多少东西可以做一些实际的事情,例如读取文件并将其拆分为单词并对其进行一些处理。为了学习Common Lisp,我对学习Common Lisp并没有兴趣,但是为了让我以前在C ++中所做的事情变得更快,出错更少。

因此,我的问题是什么是最好的资源(无论是网站,书籍还是其他任何东西),该资源重点在于教授如何使用Common Lisp执行常见的编程任务,例如

  • 如何读取文件
  • 如何读取文件,替换文件中的单词并将结果写回到文件中
  • 遍历目录和其他文件系统中的文件
  • 与SQL数据库交互
  • 通过套接字进行通信
  • 诸如Web服务器之类的线程
  • 创建GUI
  • 对二进制文件执行操作
  • 编写一个解析器(不是Lisp中Lisp的解释器,据我了解这就像Lisp的5行一样)
  • 与操作系统(例如,用C或C ++编写的东西)进行交互以完成Lisp无法本地完成的工作
  • 如何用C语言编写Lisp扩展名(可以吗?)
  • 嵌入lua解释器(可以吗?)

而且也不太实际,立即注意到,如何实现共同的数据结构,口齿不清,如堆,栈,二叉搜索树等,但可能只是使用像Lisp的列表操作car,并cdr以正确的方式。我不知道。

我高度怀疑,使用Lisp不可能实现以上任何一项(除了清单中的最后两个例外),否则人们不会非常喜欢它。我读过的上述内容提到了许多用Lisp(Yahoo!网站商店)编写的现实世界软件。

但是,在以前使用(the?)命令性语言进行编程之后,我急于使用我所获得的新知识来编写实际的应用程序。那么用Lisp学习编写实用软件的最快方法是什么?

顺便说一句,我看到彼得·塞贝尔的实践Common Lisp的,但是,以TOC来看,它只是触及了一些我想学习使用Lisp的做的事情。

我是否可以再提出一个问题(对不起,如果将两个问题合并为一个问题),在哪里可以找到对Lisp函数和内容的引用?

真的很想喜欢Lisp。


3
好问题。我本人是一名C ++程序员,今年夏天一直在学习Lisp,主要是使用答案中提出的书籍。到目前为止很高兴,但是仍然可以通过宏来实现。保罗·格雷厄姆(Paul Graham)在《 Lisp》上是一颗真正的宝石。此外,Emacs Lisp上的资料可帮助您大致了解Lisp,并允许您从编辑器本身编写真正有用的脚本。
圣地亚哥·塞维利亚,

现在在Docs.SO上的Common Lisp入门页面上有一个广泛的Common Lisp资源页面。
Gustav Bertram

现在还有一本最新的Common Lisp Cookbook。它的TOC是不是粗放而不失虽然如此,我们搜索真棒现代化的图书馆真棒CL列表。并为E. Weitz的“ CL食谱” +1。
Ehvince

Answers:


95

我建议阅读“实用的普通Lisp ”,因为它已经回答了您的一些问题。

您应该阅读三到四本书

通用Lisp参考

说明书

现在,您应该检查的下一件事是Lisp实现的手册。它描述了许多特定的扩展:网络,线程,...

常见Lisp实现的文档:

SLIME(基于Emacs的Lisp-IDE)具有SLIME用户手册

通用Lisp库的文档:

图书馆

供图书馆使用

现在来看您的一些观点:

  • 如何读取文件

请参阅HyperSpec中的文件和流字典。开放式流,读取,读取行,读取字符,读取字节,读取序列,...

  • 如何读取文件,替换文件中的单词并将结果写回到文件中

使用上面。另请参阅:WRITE和相关。

  • 遍历目录和其他文件系统中的文件

往上看。目录,路径名,...

  • 与SQL数据库交互

例如,使用CLSQL库。

  • 通过套接字进行通信

请参阅Lisp的手册或使用可移植库之一。请参阅Quicklisp。

  • 诸如Web服务器之类的线程

请参阅Lisp的手册或使用可移植库之一。请参阅Quicklisp。

  • 创建GUI

依靠。请参阅Quicklisp或实现特定的库。

  • 对二进制文件执行操作

有关文件和流操作,请参见Hyperspec。写字节,读字节。将流作为二进制流打开。

  • 编写一个解析器(不是Lisp中Lisp的解释器,据我了解这就像Lisp的5行一样)

为此,请使用现有工具之一。研究现有的解析器。有很多用Lisp编写的解析器,但是关于这方面的书很少(除了AI语言中描述的自然语言解析器)。

  • 与操作系统(例如,用C或C ++编写的东西)进行交互以完成Lisp无法本地完成的工作

依靠。请参阅Quicklisp或实现特定的库。

  • 如何用C语言编写Lisp扩展名(可以吗?)

依靠。请参阅Quicklisp或实现特定的库。-> FFI

最终建议:阅读其他作者的代码。

学习其他Lisp代码。那里有足够多种多样的Lisp代码。从网络服务器到音乐创作软件。


2
似乎很多东西是特定于实现的。是否有像C这样的东西,不是特定于实现的,而是特定于操作系统的?似乎让每个想要您的代码的人都使用您选择的实现是不可行的。我对AI也不是很感兴趣。
NewLisper 2011年

4
@NewLisper:有很多可移植性库。请参阅Quicklisp。
Rainer Joswig'Aug

4
@NewLisper:即使您对AI不感兴趣,也应该阅读一些文献,因为它描述了Lisp发明的“符号编程”方法。
Rainer Joswig'Aug

2
@NewLisper:这是一个非常完整的答案。Lisp与OS和C / C ++调用的关系更接近Python。据说将FFI(外部功能接口)组合在一起非常简单。还值得注意的是,Web上大多数Lisp Lisp用户似乎都在使用SBCL。
保罗·内森

2
我会添加一些具体的库:sockets:usocket; 网络服务器:hunchentoot; 穿线:波尔多线,chanl;操作系统交互/链接C语言:CFFI,UFFI。
Svante

6

查阅Cliki Common Lisp Wiki,它提供了Common Lisp可用库的列表,这将帮助您完成所有项目。

另外,您将要签出Common Lisp Cookbook(还有更新的版本)。它具有一堆用于执行常见任务的代码,例如一次读取一个文件,以及用于与用C编写的库进行交互的外函数接口

您可以根据所使用的实现为Lisp用C编写扩展。例如,尽管Emacs-Lisp不是Common Lisp,但您可以执行此操作。通常,您要做的是用Common Lisp编写代码,然后使用不同的Lisp编译器声明或使用外部函数接口的其他方法尽可能地优化代码。

线程取决于您使用哪种实现,但是我认为其中大多数现在都有线程。

Hunchentoot是最好的Lisp Web服务器之一,非常容易上手。您不必自己编写任何线程代码,而只需编写HTTP请求处理程序函数。

有人编译了Lisp的GUI选项列表

  • cl-gtk2,GTK gui库的接口
  • 麦克林
  • 石榴石
  • 普通Qt
  • 均衡器

1
Common Lisp Cookbook看起来真的很有用。就像我对另一个人说的那样,似乎很多东西都是特定于实现的。使希望运行代码的每个人都使用与您相同的实现似乎不公平。就是这样吗?
NewLisper 2011年

是的,确实如此,有些人还是尝试遵循ANSI Common Lisp标准,或者尝试坚持适用于多种实现的库,因此这并不是一件麻烦事。

如果您坚持使用ANSI Common Lisp,会失去做很多事情的能力,例如文件系统,网络等。
NewLisper 2011年

Lisp使在实现特定的API之上编写可移植库变得容易,因此我不必担心。
帕维尔·佩涅夫

嘿,您介意将Cookbook的网址更改为lispcookbook.github.io/cl-cookbook吗?它是相同的内容,但在很大程度上得到了增强,已删除了过时的内容,并且外观更好。查看其git历史!谢谢。
Ehvince
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.