首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在Emacs lisp中没有尾递归优化,而不是像其他方案一样?

在Emacs Lisp中没有尾递归优化的原因是因为Emacs Lisp的设计目标和用途不同于其他语言。

Emacs Lisp是一种用于扩展GNU Emacs编辑器的编程语言,它的主要目标是提供一种灵活、可扩展的编程环境,而不是追求高性能。因此,Emacs Lisp的设计更注重于易用性和灵活性,而不是追求执行效率。

尾递归优化是一种编译器优化技术,它可以将尾递归函数转化为迭代形式,从而避免了函数调用的开销和栈溢出的风险。然而,实现尾递归优化需要对编程语言的运行时环境进行特殊处理,这会增加语言的复杂性和实现的难度。

在Emacs Lisp中,由于其设计目标的特殊性,尾递归优化并不是一个必需的特性。Emacs Lisp更注重于提供一种方便的交互式编程环境,而不是追求高效的函数执行。此外,Emacs Lisp的运行时环境也相对简单,实现尾递归优化可能会增加复杂性和开发成本。

尽管Emacs Lisp没有内置的尾递归优化,但仍然可以通过其他方式来实现类似的效果。例如,可以使用迭代的方式替代递归,或者使用其他编程技巧来减少递归的深度。在实际编程中,可以根据具体情况选择最合适的方法来解决问题。

总之,Emacs Lisp没有内置的尾递归优化是基于其设计目标和用途的考虑,它更注重于提供一种灵活、可扩展的编程环境,而不是追求高效的函数执行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

几种编程语言的优缺点

你应该学会它,最终,但不是作为第一门或第二门语言。 这是很难的哦。这是很大的一步。学会怎么用 Lisp 写出C语言的程序是不够的,那没有意义。...他们当时没有足够多的 Emacs-Lisp 的人。...说了这些,还是得说回来,多继不是请客吃饭那么轻松的事儿; mixin 看起来是更好的解决方案,但是还没人完美的解决这个问题。但我还是认为 Java 比 C++ 好,即使它没有多继。...此外,Java 除了语言本身外还有老多其他的重要有用的东西。且 Java 语言本身也进化,虽然冰川一样慢,所以我们还是能看到希望。Java 正是我们应该在亚马逊推荐使用的语言。...没错,它是日本发明的,这么多地儿,没想到日本人搞出来了,还以为他们只是硬件和制造上占有名气,不是他们的软件业,所以大家都跟你一样惊奇。为什么呢,大家可能都在想。但是我认为这都是跟打字有关。

3.4K110

亚马逊工程师论各种编程语言的优缺点

你应该学会它,最终,但不是作为第一门或第二门语言。   这是很难的哦。这是很大的一步。学会怎么用 Lisp 写出C语言的程序是不够的,那没有意义。...他们当时没有足够多的 Emacs-Lisp 的人。...说了这些,还是得说回来,多继不是请客吃饭那么轻松的事儿; mixin 看起来是更好的解决方案,但是还没人完美的解决这个问题。但我还是认为 Java 比 C++ 好,即使它没有多继。...此外,Java 除了语言本身外还有老多其他的重要有用的东西。且 Java 语言本身也进化,虽然冰川一样慢,所以我们还是能看到希望。Java 正是我们应该在亚马逊推荐使用的语言。   ...没错,它是日本发明的,这么多地儿,没想到日本人搞出来了,还以为他们只是硬件和制造上占有名气,不是他们的软件业,所以大家都跟你一样惊奇。为什么呢,大家可能都在想。但是我认为这都是跟打字有关。

2.2K80
  • Clojure 开发那些事

    其实也好理解,Lisp 语言诞生这么久了,为什么一直那么小众?原因就在于 Lisp 语言过于强大,不必也不可能 Java 那么普及。你能要求每个人都能为 CTO 吗?...除了最基本的圆括号()外,方括号[]与花括号{} Clojure 用的也比其他 Lisp 方言中多。...《The Joy of Clojure》一书中有简单介绍,不过我觉得初学者可以完全不用去关心实现的细节,遇到性能问题时考虑去优化。...这一点非常重要,估计也是为什么 Clojure 较其他 Lisp 方言更流行的原因。...其实,使用第三方类库之余,多去了解其实现,代码从 Github 上 Clone 下来,慢慢看,Clojure 里面提供了很多实用的小方法,partition, juxt, group-by等等不一

    1.6K20

    史上最轻量的 IDE……

    我可以毫无问题地看高清视频、听歌、上网冲浪和许多其他事情……但显然,不是顶配的任何机器上编写代码,要求都太高了。 问题的出现和我所用的语言堆栈没有任何关系。...但我偶然发现自己旧编辑器之战中坚定地站在 Emacs 一边,正如我们将看到的那样。我想,有一天,我可能会跳到另一边去看看,但那一天并不会很快到来。 可能有人会问:为什么不是 VS Code?...在我看来,它的快捷键并不符合人体工学(而且我也懒得去定制它,因为接下来的原因),它仍然很重,基于 Electron,而且和其他的替代方案比起来,使用我关心的语言时,我觉得它很慢。...Emacs 来拯救?! 这就是为什么我目前正尝试重新使用 Emacs。 可能你不了解 Emacs,这是一款与 Vim 一样具有传奇色彩的文本编辑器,但是它所能做的事情要多得多。...你还需要对 Lisp 有一点了解(Emacs 是基于它自己的 Lisp 方言 elisp 构建的),但如果你是那种甚至考虑 Emacs 这样的东西可以彻底破解的人,这实际上也是乐趣的一部分。

    36810

    史上最轻量的 IDE……

    我可以毫无问题地看高清视频、听歌、上网冲浪和许多其他事情……但显然,不是顶配的任何机器上编写代码,要求都太高了。 问题的出现和我所用的语言堆栈没有任何关系。...但我偶然发现自己旧编辑器之战中坚定地站在 Emacs 一边,正如我们将看到的那样。我想,有一天,我可能会跳到另一边去看看,但那一天并不会很快到来。 可能有人会问:为什么不是 VS Code?...在我看来,它的快捷键并不符合人体工学(而且我也懒得去定制它,因为接下来的原因),它仍然很重,基于 Electron,而且和其他的替代方案比起来,使用我关心的语言时,我觉得它很慢。...Emacs 来拯救?! 这就是为什么我目前正尝试重新使用 Emacs。 可能你不了解 Emacs,这是一款与 Vim 一样具有传奇色彩的文本编辑器,但是它所能做的事情要多得多。...你还需要对 Lisp 有一点了解(Emacs 是基于它自己的 Lisp 方言 elisp 构建的),但如果你是那种甚至考虑 Emacs 这样的东西可以彻底破解的人,这实际上也是乐趣的一部分。

    29210

    各种编程语言的优缺点

    你应该学会它,最终,但不是作为第一门或第二门语言。 这是很难的哦。这是很大的一步。学会怎么用 Lisp 写出C语言的程序是不够的,那没有意义。...他们当时没有足够多的 Emacs-Lisp 的人。...说了这些,还是得说回来,多继不是请客吃饭那么轻松的事儿; mixin 看起来是更好的解决方案,但是还没人完美的解决这个问题。但我还是认为 Java 比 C++ 好,即使它没有多继。...此外,Java 除了语言本身外还有老多其他的重要有用的东西。且 Java 语言本身也进化,虽然冰川一样慢,所以我们还是能看到希望。Java 正是我们应该在亚马逊推荐使用的语言。...没错,它是日本发明的,这么多地儿,没想到日本人搞出来了,还以为他们只是硬件和制造上占有名气,不是他们的软件业,所以大家都跟你一样惊奇。为什么呢,大家可能都在想。但是我认为这都是跟打字有关。

    4.4K60

    我的 IDE 太重了,所以迁到了 Emacs

    我可以毫无问题地看高清视频、听歌、上网冲浪和许多其他事情……但显然,不是顶配的任何机器上编写代码,要求都太高了。 问题的出现和我所用的语言堆栈没有任何关系。...但我偶然发现自己旧编辑器之战中坚定地站在 Emacs 一边,正如我们将看到的那样。我想,有一天,我可能会跳到另一边去看看,但那一天并不会很快到来。 可能有人会问:为什么不是 VS Code?...在我看来,它的快捷键并不符合人体工学(而且我也懒得去定制它,因为接下来的原因),它仍然很重,基于 Electron,而且和其他的替代方案比起来,使用我关心的语言时,我觉得它很慢。...Emacs 来拯救?! 这就是为什么我目前正尝试重新使用 Emacs。 可能你不了解 Emacs,这是一款与 Vim 一样具有传奇色彩的文本编辑器,但是它所能做的事情要多得多。...你还需要对 Lisp 有一点了解(Emacs 是基于它自己的 Lisp 方言 elisp 构建的),但如果你是那种甚至考虑 Emacs 这样的东西可以彻底破解的人,这实际上也是乐趣的一部分。

    1.1K10

    Python的10大集成开发环境和代码编辑器(指南)

    我们将为每一款工具列出“为什么是它”和“为什么不是它”(优缺点)。最后要说的是,他们之间并不相互排斥,所以您可以几乎无害的情况下自行尝试。 但是,首先... 什么是集成开发环境和代码编辑器?...同样由于Atom建立Electron框架上,所以它始终运行在JavaScript进程不是作为本地应用运行。...GNU Emacs就是战斗的一员。伴随着狂热的追随,被称作“可扩展、可定制、自动记录、实时显示的编辑器”GNU Emacs几乎一直萦绕在UNIX周围。...缺点:定制化意味着向多种多样的脚本文件编写(或复制粘贴)Lisp,如果没有他人提供,那么你必须去学习Lisp并且搞懂它是如何运行的。...总之,我认为Spyder比其他的集成开发环境更基本,我更愿意把它看做是一款专业工具不是我日常使用的编辑环境。

    1.7K90

    如何编写高质量的 JS 函数(3) --函数式编程

    缺少不可变数据结构( JS 除了原始类型,其他都是可变的) 没有提供一个原生的利于组合函数产生新函数的方式,需要第三方支持 不支持惰性序列 缺少递归优化 JS 的函数不是真正纯种函数式语言中的函数形式...(比如 JS 函数可以写循环语句) 表达式支持赋值 1、缺少递归优化 对于函数式编程来说,缺少递归优化,是非常致命的。...就目前而言,浏览器对递归优化的支持还不是很好。 什么是递归?...如下图所示: 我们来看下面两张图: 第一张图,没有使用递归,因为 n * fatorial(n - 1) 是最后一个表达式, fatorial(n - 1) 不是最后一个表达式。...PS: 任何需求都是有优先级的,对浏览器来说,这种递归优化的优先级,明显不高。我个人认为,优先级不高,是到现在极少有浏览器支持递归优化的原因。

    1.7K00

    Clojure与LispClojure与Lisp

    所以,为什么上个世纪50年代的编程语言,到现在还没有过时?简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。...2 函数也是一种数据类型 Lisp语言中,函数与整数或字符串一样,也属于数据类型的一种。它有自己的字面表示形式(literal representation),能够储存在变量,也能当作参数传递。...3 递归 Lisp是第一种支持递归函数的高级语言。 4 变量的动态类型 Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,变量本身没有。...在读取期运行代码,使得用户可以重新调整(reprogram)Lisp的语法; 在编译期运行代码,则是Lisp宏的工作基础; 在运行期编译代码,使得Lisp可以Emacs这样的程序,充当扩展语言(extension...这可能听起来很怪异,但是对于Lisp语言却是再普通不过。最常用的做法就是使用宏。 术语"宏"Lisp语言中,与其他语言中的意思不一样

    1.9K30

    Python的10大集成开发环境和代码编辑器(指南)

    我们将为每一款工具列出“为什么是它”和“为什么不是它”(优缺点)。最后要说的是,他们之间并不相互排斥,所以您可以几乎无害的情况下自行尝试。 但是,首先... 什么是集成开发环境和代码编辑器?...同样由于Atom建立Electron框架上,所以它始终运行在JavaScript进程不是作为本地应用运行。...GNU Emacs就是战斗的一员。伴随着狂热的追随,被称作“可扩展、可定制、自动记录、实时显示的编辑器”GNU Emacs几乎一直萦绕在UNIX周围。...缺点:定制化意味着向多种多样的脚本文件编写(或复制粘贴)Lisp,如果没有他人提供,那么你必须去学习Lisp并且搞懂它是如何运行的。...总之,我认为Spyder比其他的集成开发环境更基本,我更愿意把它看做是一款专业工具不是我日常使用的编辑环境。

    1.2K60

    【翻译】Rust递归优化的故事

    诸如Haskell和Lisp家族这类函数式语言,以及逻辑语言(Prolog可能是最著名的例子)都强调采用递归的方式思考问题。这些语言通过调用优化可以性能上获得许多好处。...深入探究为什么会这样之前,让我们简要地总结一下调用优化背后的思想。...调用优化是如何工作的(理论上) 递归函数,如果运行在一个不支持TCO(译者注:TCO==Tail Call Optimization, 即调用优化)的环境,会出现内存随着函数输入的大小线性增长的情况...有了上面这些知识,让我们回来看看,为什么Rust没有做TCO。 回顾Rust的时光机 我能找到的最早关于Rust调用优化的相关资料,可以追溯到Rust项目的开始阶段。...tramp.rs是我们需要来Rust编程启用按需TCO的英雄,对么? 恐怕不是这样。

    2K20

    编程语言中那些有趣的命名

    这种计算机科学的“饶舌”现象叫作递归缩写。 递归缩写(Recursive acronym)即递归首字缩写,是一种全称递归引用它自己的缩写。      ...计算机领域,使用递归缩写是黑客社区的一个较早的传统,后来又有一些牛人把自己开发的产品或者技术使用了这种方式来命名,不得不说,牛人们不仅技术牛,开起玩笑来也是充满了geek气息。      ...这又启发了麻省理工大学的两个Lisp Machine 编辑器的命名,一个叫做 EINE (“EINE Is Not Emacs“,EINE不是 Emacs),另一个是 ZWEI (“ZWEI Was EINE...如npm、GNU一样,许多递归缩写包括否定语,通常用来指出这个缩写指代的事物 a 不是与另一个事物 b 相类似(但事实上,这个事物 a 通常与 b 非常相似甚至是 b 的衍生品)。      ...还有一些有趣的例子: Linux:Linux Is Not UniX,这就有点GNU了,但是是否属实就有待考证了。

    1.2K20

    日拱一卒,伯克利CS61A,作业10,用Lisp开发宏

    提示:如果你在运行测试样例的过程遇到递归深度越界的错误,这说明了你的实现不是一个合格的递归 开发完成之后进行测试: python3 ok -q accumulate-tail 答案 首先我们来看一下我们刚才的实现代码为什么不是递归...,原因很简单,因为当我们递归的结果返回了之后,仍然进行了操作,我们combiner了递归的结果和term(n),它依然对环境有所依赖,这就导致了递归的时候环境变量的存储不能释放,因此不是递归。...想要将实现改变成递归,那么我们就不能在递归之后进行combiner,需要在递归之前进行。...我们看下老师给的求阶乘的例子: 我们的做法本质上和这一样,将中间结果传递进递归当中,不是递归结束之后进行计算。...整个代码的结构和刚才是一样的,只不过细节上有所变化,但就是这一点不起眼的小细节,优化了运行效率。

    67030

    实用的函数式编程

    不过, 我认为这将会是一个重大的错误, 跟滥用 goto 一样严重的错误. 和放弃动态调度 (dynamic dispatch) 一样危险。 为什么呢?...所有的 map, reduce 和递归 -- 尤其是 递归 , 都非常简单. 使用这些只是一个熟悉程度的问题. 一旦你熟悉这些概念以后 -- 并不会花费太长时间, 编程会变得容易的多....此外, Clojure 基于 JVM, 它完全可以访问 Java 库, 和任何其他的 Java 框架和库. 它的互用性快速便捷....跟 Lisp 一样, Clojure 也是一个 同性(Homoiconic) 的语言, 也就是说, 代码本身就是程序能够操作的数据. 这不难看出....故而, Clojure , 所有的函数调用都是列表. 列表可以直接被代码操作. 所以, 一个程序也可以构造和执行其他程序. 最后说一句, 函数式编程十分重要. 你应该去学习它.

    1.1K20

    对 CIDER, Projectile, Prelude 作者 Bozhidar Batsov 的采访

    我记得最初设置 Emacs 时我真的很费力,所以 Prelude 这样的东西会对我有很大帮助。我想很多人对 Emacs 很好奇,但没有时间深入学习,他们会从 Prelude 获益良多。...直接回答你的问题——我认为大多数人可能会从 Prelude 这样的东西开始并逐渐根据他们的需要调整它,不是从头开始。 Emacs 已经存在了 40 多年,并且仍然很强大。你认为长寿的原因是什么?...为什么今天人们更喜欢使用 Emacs不是 VSCode 或 Sublime Text 这样的东西? 我已经多次深入回答过这个问题。...你不能公司经常尝试做的那样,用钱建立这样一个社区。 Emacs 主要针对那些想要为自己构建一个非常定制化的编辑器,不是使用别人的编辑器的人。在我看来,这总是有一些吸引力,即使目标群体很小。...与我活跃的每个编程社区的社区领导者一样

    64120

    大教堂与集市(上)

    当以我的方法去认知时,我除了努力做好个人的专案,并也试着去了解为什么Linux的世界,不但没有因为浑沌不清四分五裂,反而以教堂建造者几乎想像不到的速度茁壮。...一次和他的会面,我提出了这点见解,他微笑着,并重复他常说的一句话︰「基本上我是一个非常懒的人,因其他人在 Linux 上真正的努力,感到与有荣焉。」...回顾过去的例子, GNU EmacsLisp 程序库及其 Lisp 代码的资源库,我们可以看到 Linux 模式所用的方法和所得的成功。...我还没写作 fetchmail 前,最成功的杰作大概要算是 Emacs 的 VC(version control)功能了,这项专案进行时,我用 Linux 一样的合作模式,用 email 和其他三位作者互相联系...1992 年左右,我很认真地要把俄亥俄州 elisp 资源库许多程序加入 Emacs 正式的 Lisp 程序库,但却遭遇到官方的阻碍失败了。

    71810

    R语言的好与坏丨讲座字视频丨附讲座PDF

    另一个例子是EmacsEmacs有其编程语言名叫Emacs Lisp。是Lisp里一个非常老的分支语言。我不认为很多人喜欢这个语言,这是个完全的编程语言。...你也许能用Emacs Lisp编写web服务器,尽管我不认为有人这么做过。其实我不该这么说。 很多人都认为Emacs Lisp是,为了获取Emacs的功能付出的代价。R语言在这点上有点相似。...所以你不会看到统计学家使用Mathematica这种语言,但这在数学系很常用,像我们之前的幻灯片上看到的。它在统计学不怎么用到。 很多人在学统计的同时学习R语言。...通常熟悉R语言,只熟悉R语言的人,他们热爱他们的领域特定语言,他们也领域外使用它。 我很确定有人用R语言编写web服务器,就像有人会用Emacs Lisp编写web服务器一样。...我没试过用SAS编程,但根据我的了解,SAS跟DOS批处理文件一样复杂。它更像一种宏语言,不太传统编程语言。这就解释了为什么使用SAS的人,喜欢SAS的附带功能。

    1.8K90
    领券