返回

文章详情

通往Lisp之路:为什么选择Lisp

Hacker News2026年7月9日 13:06

大多数程序员在第一次看到一些Lisp代码时,毫无疑问会问:“这到底是啥?”。我第一次阅读它那不寻常的语法时,也问了自己同样的问题:那么多括号,奇怪的缩进,还有谁会想到用format的第一个参数来打印到标准输出? (defun flip-coin-for-real () (<= (random 100) 80)) (defun hello-lisp () (write-line "你叫什么名字?") (let ((name (read-line)) (learn-it (if (flip-coin-for-real) "应该" "不应该"))) (format t "你好,~A.~%" name) (format t "Oracle说……你~A 学习Lisp!~%" learn-it))) 在适应了读取包含那么多括号的代码后,我需要学习如何使用包和符号,如何创建新项目和导入库,如何使用REPL,以及如何使用条件和重启。最重要的是,构建算法时我必须转变思维方式。与大多数常见语言相比,Lisp的学习曲线陡峭。但它也能解锁那些语言永远无法实现的技能。为什么?因为在Lisp中,你可以做其它语言中不可能的事情。Lisp开启了新的可能性,允许算法以不同的形状出现,赋予程序员更多的权力和灵活性。 保罗·格雷厄姆创造了“布鲁布悖论”的术语来解释为什么仅使用过不那么强大的语言的程序员很难理解Lisp的威力。简而言之,就是因为他们缺乏感知这些语言所缺失的概念,以及Lisp相对于它们的优势。路易斯·阿姆斯特朗对爵士乐说过类似的话:如果你要问爵士乐是什么,那你将永远也无法知晓。——路易斯·阿姆斯特朗。 在这篇文章中,我将解释一些特点,展示为什么这门特殊的语言值得学习。这不是一条容易的路,要真正掌握它的力量,你需要亲自使用Lisp。即使你最终不使用Lisp,你也会对编程语言能做什么有不同的视角。Lisp将使你成为更好的程序员,因为它改变了你使用代码思考问题的方式。更具体地说,它将教会你一种其他编程语言无法实现的方法。 你将能够编写Lisp本身的程序,从而使你使用的语言适应你正在解决的问题。使用Lisp,你将学会将语言发展到你的问题上,然后在那种语言中编写程序。 可扩展性Lisp在内部是可扩展的。专家—被称为Lispers—通常将它称为可编程的编程语言。不仅你会为你的程序编写代码,还可以编写扩展Lisp本身的代码。这得益于宏操作符。如果你在 C、Rust或Swift等语言中使用过宏,不要期望它们是相同的。那些宏主要用于消除模板或生成重复的代码。除此之外,Lisp中的宏允许你创建新的构造,使其成为语言本身的一部分。对于Lisp程序员来说,这是最难掌握的特性之一,所以我不会在这里教你如何使用它们或它们是如何工作的。我只是想让你尝试一下它们的作用。 例如,C程序员可能希望使用while操作符来定义一个简单的循环。普通Lisp没有提供它,所以程序员可以编写一个宏并将其添加到语言中。 (defmacro while (condition &body body) `(loop while,condition do(progn,@ body))) 新的while宏在条件为真时执行一系列指令(主体)。它使用loop,loop本身也是一个用于编写复杂迭代的宏(注意它也使用了while符号)。progn是一个特殊形式,接受多个表达式,按顺序运行它们,并返回最后一个的结果。我们可以使用新的while操作符,而不是编写(loop while ... do(progn ...)),简化了代码,使其类似于C。我们刚刚扩展了可用的语言。 (let((counter 3)) (while(> counter 0)(print counter)(decf counter)));; 3 ;; 2 ;; 1 初学者可能无法理解这里真正的魔力,因为除了独特的语法,defmacro与defun看起来非常相似,而后者在第一个代码示例中用于定义新函数。为了更好地理解两者之间的区别,让我们将新的while定义为一个函数,然后调用它。 (defun fake-while(condition body)(loop while condition do(funcall body))) (let((counter 3)) (fake-while(> counter 0)(progn(print counter)(decf counter)))) loop是我们之前使用过的相同宏;funcall调用作为第一个参数接收的函数,在这种情况下是body。尝试在Common Lisp REPL中执行上面的代码。你将收到一个类型错误,类似于这个:值2不是函数类型。这是因为对fake-while的参数立即被求值。(< x 3)的求值结果为t——真。由于progn是一个函数,

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡