请一一回复。
如果您解释为什么它不正确,请尽量避免一般性陈述并提供特定示例。
所有的括号都使代码不可读。大约两周后,使用一个不错的文本编辑器,你就不再注意到它们了。
[ETA - 刚刚找到了长期 lisper 肯尼·蒂尔顿的一句话:“括号?什么括号?自从我开始 Lisp 编程的第一个月以来,我没有注意到任何括号。我想问那些抱怨 Lisp 中括号的人,如果他们是被报纸上所有单词之间的空格所困扰......"]
我最喜欢的误解:它是一种“函数式语言”,不鼓励迭代或 OOP 或任何你能说出的编程风格。
没有什么比真相更遥远。
首先,根据说话者的意思,“Lisp”根本不是一种语言,而是一个语系。这个家族有几个或多或少知名且广为人知的成员:Scheme、Common Lisp、Emacs-Lisp和AutoLisp是传统的;如今,还有Nu、newLISP(实际上更像是“oldLISP”而不是现代的,但无论如何)、Arc和Clojure。
诚然,Schemers 似乎更喜欢函数式风格并且不鼓励迭代而支持递归。然而,据我所知,Schemers 实际上在 Lisp 世界中是少数,至少在考虑将 Lisp 作为编程工具而不是研究或研究对象的实际用途时。
我对 AutoLisp 或除了 Scheme 和 Common Lisp 之外的所有其他 Lisp 方言知之甚少,但我所知道的是,Common Lisp 绝对不是一种避免命令式甚至面向对象编程的单一范式语言。事实上,Common Lisp 具有我所知道的最强大的基于类的对象系统,它结合了开箱即用的面向方面编程之类的东西。
在我看来,Lisp 实际上是最鼓励在新方向上进行实验的语言家族,并且最容易整合从一开始就不受支持的编程范式。这包括命令式编程。Common Lisp 甚至有 GOTO!
Lisp 是一种解释型语言,因此它真的很慢。
查看 Common Lisp Hyper Spec 中的函数disassemble。
一个名为SBCL的 Common Lisp 实现带有适用于许多平台的高效本机编译器后端。
那是为了人工智能
许多人认为 lisp 是一种面向列表的语言(不管这意味着什么)。
即使在 lisper 中,人们也普遍认为,关于 lisp 的一个伟大和最重要的事情是 cons 单元和可以使用它们构建的单链表(sexp's)。相信 lisp 的人不理解使 lisp 成为比其他主流语言更高效的语言的真正原因(这只是我的主观意见!),并且不理解 lisp 几乎可以是它的样子,如果没有游戏中的缺点细胞。
随机选择一些对 lisp 很重要的东西,并且在没有 sexp 的情况下很容易做到:
一些解释:
简而言之,动态类型意味着不是位置有类型,而是运行时值。如果您事先不了解所有需求,并且您的应用程序随着项目的发展而不断变化,这将是一个重要的帮助。根据我的经验,到目前为止,大多数情况都是如此——只有当静态类型出现在图片中时,才会遇到更多的障碍。
可能很多人会争辩说,cons 单元和 sexp 对灵活的宏观系统至关重要。关键是一个简单的语法和一个易于操作的数据结构,它被解析成。sexp 语法和列表一起是一个很好的候选,但还有很多其他的。
我对括号很满意,但我对另一部分不满意,即使用 cons'd 列表来表示程序代码,因为它有一个重要的缺陷:你不能在不干扰数据的情况下用随机的东西注释它那已经用它来表示了。例如,我不能用它在两天前由 Joe 编辑的事实来注释这样一个表示程序代码的 cons'd 列表,而不会将这种形式变成 lisp 编译器的废话。随着您的 DSL 变得越来越复杂,并且随着您的宏变成将您的 DSL 编译为 lisp 的小型编译器,这些注释变得越来越重要。
我不知道有一个最喜欢的误解......但是我经常看到程序员谈论“LISP”以及他们为什么不喜欢它/它不合适/它是学术性的/它永远不会适用于项目 X。会很好,除了当他们说“LISP”时,他们的意思是“Scheme”,他们真正的意思是“Scheme 的一个子集”,他们真正的意思是“5 年前那个 AI 或语言课程中记住一半的 Scheme 子集,他们不喜欢”。
从这个方向来看,对 Lisp(s) 似乎有相当多的非理性偏见。理性的偏见完全是另外一回事。
我最喜欢的 lisp 误解:CL 真的意味着 CthuLhu!
笑话不谈;到目前为止,关于各种 lisp 方言的最普遍的误解是,s 表达式语法依赖于括号会损害可读性,而实际上正是这种特性有助于使 lisp 代码比大多数其他编程语言。
我没有“最喜欢的”误解,因为大多数误解,不仅是关于 Lisp,只是令人烦恼。但是当我阅读 Lisp 的历史(特别是 Lisp 的历史和 Lisp 的演变)时,我对 Lisp 有一个误解,这让我非常震惊。
众所周知,Lisp 是一种慢速解释语言,但实际上它在拥有第一个工作解释器后不到一年就拥有了一个编译器,我认为,下面的历史是一长串针对优化的工作,导致一些 Lisp 实现在数量上击败了 Fortran!
神话的最可能来源是,许多人只是从有关 Scheme 的 CS 课程中了解 Lisp,他们在那里为自己编写了一个解释器。可能他们中的许多人讨厌这门课程,因为它教给他们关于可计算性或递归的美丽但复杂的概念,然后他们将课程的问题与 Lisp 的问题同化。
Lisp 中的一切都是一个列表,没有其他高效的复杂数据结构。
不对。在 Common Lisp 中有类、结构、哈希表、多维数组、可变字符串等。每一个都被有效地实现。例如,SBCL 编译器为数组访问发出优化的内联本机代码。
“宇宙是用 Lisp 写的”。但显然不是。
Lisp 没有 IDE,所以你必须使用记事本,不断地计算所有多余的括号。
事实上,有不少。对于 Common Lisp,最好在 windows 和 linux 下都使用 Emacs 和SLIME 。它提供了一个 Listener(用于评估)、一个 Inspector(用于查看结果)、一个 Debugger(带步进)、一个高度可定制的 Editor(这毕竟是 Emacs)。SLIME 支持 10 种不同的实现。
That it is a programming language. Today Lisp is a family of programming languages including Common Lisp and Scheme, which are standards with various implementations each, and also Clojure, Arc and many others.
Lisp 不能提供独立的可执行文件。
使用 SBCL,您可以通过简单的函数调用将 lisp VM 的当前状态保存到单个可执行文件中。当您启动此可执行文件时,它将从原始状态开始并调用您在保存时提供的函数或 lambda。
“CLOS”是一种编程语言,而Lisp 是一种解释性的、仅功能的语言。真的,我是从 CS 教授那里听说的。而且我认为在这些编程语言概念书中有一些误导性的图表表明了这一点。
当今大学和大学的 CS 教师(尤其是年轻教师)接受过 Java、C 和 C++ 的教育,他们可能在一门名为“编程语言的比较研究”或“编程范式”的课程中学习了 Scheme 或 Common Lisp,这是可能是由不喜欢任何 Lisp 语言的人教的,教他们函数、列表、符号和高阶函数。时期。然后他们最终教他们学到的东西:
我什至看到一位非常聪明的教授在 Common Lisp 中给出了一个矩阵乘法的例子——当然,将矩阵表示为列表!
因为人们使用 Lisp 解决难题,所以语言本身一定很困难。
递归很难。函数的定点很难。但是它们几乎没有涵盖计算机程序的结构和解释的第 1 章。这并不是因为 Scheme 很难——实际上是因为它很简单,剩下的就是困难的事情!
人们将括号归咎于lisp。我想让他们说如果没有它们,他们将如何实现面向列表数组的语言......
任何足够先进的应用都无法与线路噪声区分开来。