学习Common Lisp的技巧(适用于Windows/C++程序员)

6
我是一名有经验的C++/.NET/Java Windows/web程序员,正在尝试学习(通用)Lisp。我正在阅读Practical Common Lisp并使用SLIME
我可以比较容易地理解Lisp语言,但我在开发机制方面遇到了困难。其中一个问题是如何处理Emacs。我没有任何使用它的经验,并且发现它通常很令人困惑,很难找到/弄清楚命令。
具体问题:
  • 我知道REPL是什么,但我不太明白如何有效地使用它。当我需要更改一个函数时,我必须重新输入defun并进行更改(繁琐且容易出错)。有没有更好的方法?
  • 我如何从在REPL中输入代码变成实际拥有程序?我习惯了C模型,其中你可以查看、编辑和重新编译代码文件。我知道Lisp有类似的东西(通过load函数),但怎样才能将我刚刚定义和测试过的函数放进一个要保存的文件中呢?我希望有比我的当前选择+复制+粘贴更好的方法。
  • 你如何调试错误?有没有像其他语言一样能够逐步执行代码的能力?
  • 只要S表达式有效,我输入(defun ...)就不会出现任何错误。直到我尝试使用它时,我才发现它是无效的。有没有什么方法可以更早地获得错误(例如编译代码)?
  • 是否有一些更熟悉或让我更容易尝试语言的IDE?
  • 我应该转而学习Scheme吗?
任何提示将不胜感激!

1
你可能也想了解一下Clojure;它是一个在JVM上运行的Lisp方言,并且与Java有良好的互操作性。我还没有使用过它,但看了几个讲座,感觉很不错。 - paul
4个回答

6
我了解REPL,但不太清楚如何有效地使用它。当我需要更改函数时,我必须重新输入defun并进行更改(繁琐和容易出错)。有没有更好的方法呢? 从在REPL中输入代码到实际拥有一个程序,应该怎么做?我习惯于C模型,其中您可以审查、编辑和重新编译代码文件。我知道Lisp有类似的功能(通过load函数),但如何将刚刚定义和测试过的函数放入要保存的文件中?我希望有比我当前选择+复制+粘贴更好的方法。 加载SLIME。在您的.lisp文件中输入代码,然后运行slime-eval-buffer将所有代码加载到Lisp中。然后,对于您正在处理的特定函数,在运行的Lisp中重新定义它的C-e、C-j键。 如何调试错误?是否有像其他语言一样步进到代码的能力?

是的。(trace 'my-function) - 或者类似这样的语句 - 当 my-function 被调用时,它会进入调试器。

-只要 S 表达式有效,我在输入 (defun ...) 时就不会出现任何错误。直到我尝试使用它时,我才发现它无效。有没有办法更早地检测到错误(例如编译代码)?

在某种程度上,这是动态语言(Python、Perl、Ruby、Lisp 等)的特点。尝试使用 SBCL 进行更好的错误检查。

-有没有一些 IDE 更加熟悉或更容易让我使用 Lisp 语言?

Emacs 是 Lisp 的免费 IDE。Allegro 有一个免费版,但我从未尝试过。

-我应该转而学习 Scheme 吗?

不,Scheme 不是一种实用的语言。


2
我是一名有经验的C++/.NET/Java Windows/Web程序员,正在尝试学习(通用)Lisp。我正在阅读《实用Common Lisp》,并使用SLIME。
学习Lisp还可以使用LispWorks Personal Edition。它有一些限制,完整版是商业产品,但使用起来要容易得多。
我理解REPL,但不太明白如何有效地使用它。当我需要改变一个函数时,我必须重新输入defun并进行更改(繁琐且容易出错)。我该如何更好地处理这个问题?
REPL具有历史记录。通过键盘命令,您可以回到先前的输入并对其进行更改。除此之外,只需编辑一个Lisp文件,从那里编译代码即可。在Lisp中,您可以编译/评估单个表达式和定义。像SLIME、LispWorksAllegro CL这样的典型IDE还允许您从普通的Lisp文本窗口运行代码 - 除了在REPLA(也称为Listener)中执行表达式之外。
从在REPL中输入代码到实际拥有一个程序,该怎么做?我习惯于C语言的模式,即有可以查看、编辑和重新编译的代码文件。我知道Lisp也有类似的功能(通过load函数),但是如何将我刚定义并测试过的函数保存到文件中呢?我希望有比我的当前选择+复制+粘贴更好的方法。
复制和粘贴是一种方法,但正确的方法是在编辑器窗口中从文本文件中工作。可以编译/加载表达式、编辑器缓冲区或相关文件。
如何调试错误?是否有像其他语言一样进入代码的能力?
请参见STEP、TRACE等相关内容。SLIME、LispWorks和Allegro CL都有很多额外的功能。
只要S表达式有效,我在输入(defun ...)时就不会出现任何错误。直到我尝试使用它时才发现它无效。有没有办法更早地发现错误(例如编译代码)?
对于许多情况,人们使用编译器。编译器将找到一系列错误,并在某些不寻常的情况下发出提示(例如函数不存在或变量未定义)。
-有没有一些更熟悉的IDE,可以让我更轻松地使用该语言?
LispWorks、Allegro CL在Windows下是最好的选择。还有一些替代品,如Corman Lisp(我不知道它现在是否得到维护),甚至是Ufasoft Lisp。
“我应该转而学习Scheme吗?”
不是真的需要。

1

听起来你并没有真正地使用SLIME,或者至少不是它预期的方式。(“必须重新输入defun”,“C模型中你需要代码文件”)

我建议观看一些SLIME的屏幕录像(或者更好的是,如果你身边有一个Lisp程序员,观察他使用SLIME几分钟)。 SLIME网页有几个视频。


谢谢,我肯定认为关于SLIME的教程会很有帮助。 - davesw

1

听起来你会非常喜欢DrRacket IDE。Racket更接近Scheme而不是Common Lisp,但你可以在没有Emacs风格开发的速度障碍的情况下涉足Lisp家族。


这听起来很有趣。我会看看这个编程语言/集成开发环境。 - davesw

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