我理解 LET 和 LET * (并行与顺序绑定)之间的区别,作为一个理论问题,它非常有意义。但是有没有什么情况下你真的需要 LET 呢?在我最近查看的所有 Lisp 代码中,您可以不做任何更改地将每个 LET 替换为 LET * 。
编辑: 好的,我知道 为什么有人发明了 LET * ,大概是作为一个宏,回溯到很久以前。我的问题是,考虑到 LET * 的存在,是否有一个让 LET 留下来的理由?您是否编写过任何实际的 Lisp 代码,其中 LET * 不能像普通的 LET 那样工作?
我不同意效率的说法。首先,识别那些可以将 LET * 编译为具有同样效率的 LET 的情况看起来并不难。其次,CL 规范中有很多东西看起来根本不像是围绕效率设计的。(您最后一次看到带有类型声明的 LOOP 是什么时候?这些东西太难弄清楚了,我从来没见过它们被使用过。)在迪克•加布里尔(Dick Gabriel)的基准指数出现在20世纪80年代后期之前,CL 曾经是指数完全放缓。
看起来这是向后兼容性的另一种情况: 明智的是,没有人愿意冒险破坏 LET 这样基本的东西。这是我的直觉,但是听到没有人有一个愚蠢简单的情况下,我错过了 LET 使一堆事情可笑地比 LET 更容易,这是令人欣慰的。