我们最喜欢Lisp的误解是什么?

时间:2020-03-06 14:39:22  来源:igfitidea点击:

请一一回应。

如果我们解释为什么不正确,请尝试避免使用一般性陈述并提供特定示例。

解决方案

任何足够先进的应用都无法与线路噪声区分开。

"宇宙是用Lisp编写的"。但显然不是。

那是为了人工智能

人们将括号归咎于口齿不清。我想让他们说如果没有他们,他们将如何实现面向列表数组的语言...

Lisp是一种解释性语言,因此它确实很慢。

查看Common Lisp Hyper Spec中的反汇编功能。

一个称为SBCL的Common Lisp实现带有针对许多平台的高效本机编译器后端。

我没有"最喜欢的"误解,因为大多数误解,不仅是关于Lisp的,都是烦恼。但是当我阅读Lisp的历史(特别是Lisp的历史和Lisp的演变)时,我对Lisp的误解确实使我震惊。

Lisp在许多人中被认为是一种缓慢的解释语言,但实际上,我认为它的编译器在拥有第一个工作解释器之后不到一年,而以下的历史是针对优化的一长串工作清单:导致一些Lisp实现在数量上击败了Fortran!

神话的最可能来源是,许多人只是从CS计划的CS课程中认识Lisp的,他们在那里为自己编写了一个口译员。也许他们中的许多人讨厌这门课程,因为它教会了他们关于可计算性或者递归的美丽但复杂的概念,然后他们将课程中的问题与Lisp的问题相融合。

我最喜欢的误解:它是一种功能语言,不鼓励迭代或者OOP或者我们可以命名的任何编程风格。

没有什么比真相更遥远。

首先,取决于说话者的意图,Lisp根本不是一种语言,而是一种语言家族。这个家族有一些或者多或者少的知名和广泛的成员:Scheme,Common Lisp,Emacs-Lisp和AutoLisp是传统的成员。如今,还有Nu,newLISP(实际上更像是旧的LISP,而不是现代的LISP),Arc和Clojure。

当然,Schematers似乎偏爱功能性样式,不鼓励迭代而偏爱递归。但是,据我所知,至少在考虑将Lisp实际用作编程工具(而不是研究对象)时,策划者实际上是Lisp世界中的少数派。

我对AutoLisp或者Scheme和Common Lisp之外的所有其他Lisp方言了解不多,但是我所知道的是Common Lisp绝对不是避免命令式甚至面向对象编程的单一范例语言。实际上,Common Lisp拥有我所知道的功能最强大的基于类的对象系统,将诸如面向方面的编程之类的东西立即使用。

在我看来,Lisp实际上是一种语言家族,它最鼓励新方向的实验,并且最容易纳入一开始不支持的编程范例。这包括命令式编程。 Common Lisp甚至拥有GOTO!

我最喜欢的对Lisp的误解:CL的真正含义是CthuLhu!

开个玩笑;到目前为止,关于lisp方言的所有方式的最普遍误解是s表达式对括号的依赖会损害可读性,而实际上正是这种特质使Lisp方言比Lisp方言更加简洁,清晰和可读大多数其他编程语言。

Lisp无法提供独立的可执行文件。

使用SBCL,我们可以通过简单的函数调用将lisp VM的当前状态保存到单个可执行文件中。
启动此可执行文件时,它将从原始状态启动,并调用保存时提供的函数或者lambda。

Lisp没有IDE,因此我们必须使用记事本并不断计算所有多余的括号。

实际上,有很多。对于Common Lisp,最好在Windows和Linux下将Emacs与SLIME一起使用。它提供了一个侦听器(用于评估),一个检查器(用于监视结果),一个调试器(带有步进),一个高度可定制的编辑器(毕竟这是Emacs)。 SLIME支持10种不同的实现。

我不知道有一个最喜欢的误解……但是我经常看到程序员谈论" LISP",为什么他们不喜欢它/它不合适/它是学术性的,对X项目永远都不会起作用。会很好,除非当他们说" LISP"时表示"方案",即表示"方案的子集",即表示"记住了五年前从该AI或者语言课程中获得的方案的一半"不喜欢"。

从这个方向看,对Lisp似乎存在很多非理性的偏见。理性的偏见完全是另外一回事。

所有括号使代码不可读。大约两周后,使用了不错的文本编辑器,我们就不再需要注意它们了。

[ETA刚刚找到了一个长期的健谈者肯尼·蒂尔顿(Kenny Tilton)的名言:"括号?什么是括号?自从我在Lisp编程的第一个月以来,我还没有注意到任何括号。我想问一下那些抱怨Lisp括号的人是否被打扰了。报纸上所有单词之间的空格..."]

Lisp中的所有内容都是列表,没有其他有效的复杂数据结构。

不对。在Common Lisp中,有类,结构,哈希表,多维数组,可变字符串等。其中的每一个都有效实现。例如,SBCL编译器发出优化的内联本机代码以进行数组访问。

许多人认为lisp是一种面向列表的语言(无论怎么说)。

即使在lispers中,人们也普遍认为,关于lisp的一个最重要也是最重要的事情是cons单元格和可以使用它们构建的单链表(sexp列表)。那些相信不理解使Lisp比其他主流语言更富生产力的真正原因的人(这只是我的主观意见!),并且不理解Lisp几乎就是没有它的实质在游戏中完全没有缺点。

随机选择对于使Lisp变得重要的事情很重要,并且无需sexp即可轻松实现:

  • 替换
  • 编译器在运行时可用
  • 动态打字
  • 句法抽象(宏)
  • 闭包
  • 简单的语法,易于编辑(并可以通过大脑"解析")

一些解释:

简而言之,动态类型意味着不是场所具有类型,而是运行时值。如果我们事先不了解所有需求,并且随着项目的发展应用程序在不断变化,这将是一个重要的帮助。根据我的经验,在大多数情况下,只有在图片中使用静态键入时才会遇到更多障碍。

可能许多人认为,cons单元和sexp对于灵活的宏系统至关重要。关键是要使用简单的语法和易于解析的数据结构。 sexp语法和列表一起是不错的选择,但还有许多其他选择。

我对括号满意,但对另一部分不满意,即使用缺点列表来表示程序代码,因为它有一个重要的缺陷:我们不能在不干扰数据的情况下用随机内容对其进行注释已经用它表示了。例如我无法用两天前Joe对它进行编辑的事实来注释这样一个代表程序代码的缺点列表,而不会将该形式转换为对Lisp编译器的废话。随着DSL变得越来越复杂,以及宏变成小型编译器,从而将DSL编译成Lisp,这些注释变得越来越重要。

那是一种编程语言。如今,Lisp是一门编程语言家族,包括Common Lisp和Scheme,这是各自具有各种实现方式的标准,以及Clojure,Arc和许多其他语言。

" CLOS"是一种编程语言,而Lisp是一种解释性的,仅功能的语言。真的,我从CS教授那里听说过。而且我认为在这些《编程语言概念》书中有一本有误导性的图表表明了这一点。

今天,高等学校的CS老师(尤其是年轻的CS老师)是使用Java,C和C ++进行教育的,他们很可能在名为"编程语言比较研究"或者"编程范例"的课程中学习了Scheme或者Common Lisp。可能是由不喜欢任何Lisp语言的人教过的,并教给他们有关函数,列表,符号和高阶函数的知识。时期。
然后他们最终教出他们学到的东西:

  • Lisp是一种编程语言
  • Lisp被解释
  • Lisp慢
  • Lisp是一种AI语言(我上次查看Robert Sebesta的书时,它仍然声称-但是有一个新版本,因此他可能已解决此问题)
  • Lisp没有OO支持(!!!)
  • Lisp是一种功能语言(相对于最低限度地支持任何其他范例而言)
  • 在Lisp中,没有数据类型
  • Lisp除列表外没有其他数据结构(因此对数字运算无用)
  • "不再使用Lisp,仅在本课程中使用它,因为它是最重要的功能语言"

我什至看到一位非常聪明的教授在Common Lisp中举了一个矩阵乘法的例子-当然,将矩阵表示为列表!

那是因为人们使用Lisp解决了棘手的问题,所以语言本身必须很困难。

递归很难。功能的固定点很难。但是它们仅涵盖了《计算机程序的结构和解释》的第一章。那不是因为Scheme很难-实际上是因为它很简单,剩下的就是要做的一切!