【问题标题】:Where to learn how to practically use Common Lisp [closed]在哪里学习如何实际使用 Common Lisp [关闭]
【发布时间】:2011-11-05 16:36:45
【问题描述】:

我是一名尝试学习 Common Lisp 的 C++ 程序员。我看过一些类似 Lisp 的书,并阅读了许多关于 Lisp 各种优点的在线文章。不过,我需要一些建议。

我所读到的几乎所有关于 Common Lisp 的内容都与它的神奇之处、用它完成工作的速度有多快以及它如何惊人地解决了 30 年前现代编程语言的许多问题有关。还有宏是多么神奇,每种编程范式(OO、函数式、基于actor的等等)如何在 Lisp 中使用,以及列表如何成为最终的数据结构。基本上将 Lisp 视为一种研究语言,并说明它的不同和革命性。

所有这些东西可能都是真的,但问题是我还没有看到太多关于如何做实际事情的东西,比如读取文件并将其拆分为单词并对其进行一些处理。我对学习 Common Lisp 的兴趣不是为了学习 Common Lisp,而是为了让我过去在 C++ 中做的事情做得更快,错误更少。

所以我的问题是专注于教授如何使用 Common Lisp 完成常见编程任务的最佳资源(无论是网站、书籍还是任何东西)是什么喜欢

  • 如何读取文件
  • 如何读取文件、替换文件中的单词并将结果写回文件
  • 迭代目录中的文件和其他文件系统内容
  • 与 SQL 数据库交互
  • 通过套接字进行通信
  • 像网络服务器这样的东西的线程
  • 创建图形用户界面
  • 对二进制文件执行操作
  • 编写解析器(不是 Lisp 中的 Lisp 解释器,据我了解,它就像 5 行 Lisp)
  • 与操作系统(即用 C 或 C++ 编写的东西)交互以完成 Lisp 本身无法完成的任务
  • 如何用 C 编写 Lisp 扩展(这可能吗?)
  • 嵌入 lua 解释器(这可能吗?)

还有一个不太直接的实用说明,如何在 lisp 中实现常见的数据结构,如堆、堆栈、二叉搜索树等。然而,这可能只是使用 Lisp 的列表操作,如 carcdr以正确的方式。我不知道。

我非常怀疑 Lisp 不可能实现这些(除了列表中的最后两个例外),否则人们不会那么喜欢它。我读过的上述内容提到了许多用 Lisp 编写的现实世界软件(想到了雅虎网络商店)。

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

顺便说一句,我看过 Peter Seibel 的 Practical Common Lisp,但从 TOC 来看,它只涉及到一些我想学习的东西用 Lisp 来做。

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

真的很想喜欢 Lisp。

【问题讨论】:

  • 好问题。我本人是一名 C++ 程序员,今年夏天一直在学习 Lisp,主要是通过答案中提出的书籍。到目前为止非常高兴,但仍然可以通过宏。 Paul Graham 的 On Lisp 是一颗真正的宝石。此外,Emacs Lisp 上的资料可以帮助您总体上跟踪 Lisp,并允许您从编辑器本身编写真正有用的脚本。
  • Docs.SO 上 Common Lisp 的入门页面上现在有一个广泛的 Common Lisp Resources 页面。
  • 现在还有一个最新的Common Lisp Cookbook。虽然它的 TOC 还没有那么广泛,所以我们在 Awesome CL 列表中搜索 awesomemodern 库。并为 E. Weitz 的“CL 食谱”+1。

标签: lisp common-lisp


【解决方案1】:

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

您可能应该阅读三到四本书

通用 Lisp 参考

手册

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

Common Lisp 实现文档:

SLIME(基于 Emacs 的 Lisp-IDE)有一个 SLIME User Manual

Common Lisp 库的文档:

供图书馆使用

现在看看你的一些观点:

  • 如何读取文件

查看HyperSpec 中的文件和流字典。 WITH-OPEN-STREAM, READ, READ-LINE, READ-CHAR, READ-BYTE, READ-SEQUENCE, ...

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

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

  • 迭代目录中的文件和其他文件系统内容

见上文。目录,路径名,...

  • 与 SQL 数据库交互

使用例如 CLSQL 库。

  • 通过套接字进行通信

请参阅 Lisp 手册或使用其中一个可移植库。请参阅 Quicklisp。

  • 像网络服务器这样的东西的线程

请参阅 Lisp 手册或使用其中一个可移植库。请参阅 Quicklisp。

  • 创建图形用户界面

视情况而定。请参阅 Quicklisp 或特定于实现的库。

  • 对二进制文件执行操作

请参阅 Hyperspec 了解文件和流操作。写字节,读字节。将流作为二进制流打开。

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

为此使用现有工具之一。研究现有的解析器。有很多用 Lisp 编写的解析器,但在有关这方面的书籍中却不多(除了自然语言解析器,它们在 AI 文献中有所描述)。

  • 与操作系统(即用 C 或 C++ 编写的东西)交互以完成 Lisp 本身无法完成的任务

视情况而定。请参阅 Quicklisp 或特定于实现的库。

  • 如何用 C 编写 Lisp 扩展(这可能吗?)

视情况而定。请参阅Quicklisp 或特定于实现的库。 -> FFI

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

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

【讨论】:

  • 似乎很多东西都是特定于实现的。有没有像 C 那样不是实现 特定但操作系统 特定的东西?让每个想要你的代码的人都使用你选择的实现似乎是不可行的。而且我对人工智能也不是很感兴趣。
  • @NewLisper:有很多可移植库。请参阅 Quicklisp。
  • @NewLisper:即使你对人工智能不感兴趣,你也应该阅读一些文献,因为它描述了发明 Lisp 的“符号编程”方法。
  • @NewLisper:这是一个非常完整的答案。 Lisp 在与 OS 和 C/C++ 调用的关系方面更接近 Python。据说将 FFI(外来函数接口)放在一起非常简单。还值得注意的是,网络上的 Common Lisp 用户的优势似乎正在使用 SBCL。
  • 我会添加一些具体的库:sockets: usocket;网络服务器:hunchentoot;线程:波尔多线程,chanl;操作系统交互/链接 C-stuff:CFFI、UFFI。
【解决方案2】:

查看Cliki the Common Lisp wiki,它提供了可用于 Common Lisp 的库列表,可帮助您完成所有项目。

此外,您还需要查看the Common Lisp Cookbook(还有更多updated version)。它有一堆用于常见任务的代码,例如reading a file one line at a timeForeign Function Interfaces for interacting with libraries written in C

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

线程取决于您使用的实现,但我认为它们中的大多数现在都有线程。

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

有人编译a list of GUI options for Lisp:

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

【讨论】:

  • Common Lisp Cookbook 看起来非常有用。就像我对另一个人说的那样,似乎很多东西都是特定于实现的。让您希望能够运行您的代码的每个人都使用您使用的相同实现似乎不公平。就是这样吗?
  • 是的,就是这样,有些人尝试坚持 ANSI Common Lisp 标准,或者尝试坚持使用跨多种实现的库,这样就不会太麻烦了。跨度>
  • 如果你坚持使用 ANSI Common Lisp,你会失去做很多事情的能力吗,比如文件系统的东西、网络的东西等等?
  • Lisp 使得在实现特定的 API 之上编写可移植库变得很容易,所以我不用担心。
  • 嘿,您介意将 Cookbook 的 url 更改为 lispcookbook.github.io/cl-cookbook 吗?它是相同的内容,但在很大程度上增强了,删除了过时的东西,并且看起来更好看。查看它的 git 历史!谢谢。
猜你喜欢
  • 2011-04-19
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多