首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure let与通用Lisp let

Clojure let与通用Lisp let
EN

Stack Overflow用户
提问于 2015-03-31 09:20:34
回答 2查看 835关注 0票数 6

在通用Lisp中,let使用一个绑定列表,即:

代码语言:javascript
复制
(let ((var1 1)
      (var2 2))
  ...)

而Clojure则使用向量:

代码语言:javascript
复制
(let [a 1
      b 2]
  ...)

除了可读性之外,是否有任何特定的原因让Clojure使用向量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-31 09:56:03

您可以在简单容易 -幻灯片14上找到Rich的论点,大约26分钟:

票数 8
EN

Stack Overflow用户

发布于 2015-03-31 17:02:40

里奇对此的看法如下:

“既然我们讨论的是语法,那么让我们来看看经典的Lisp。这似乎是最简单的语法,所有东西都是符号、数字和其他一些东西的括号列表。还有什么能更简单呢?但在现实中,这并不是最简单的,因为为了实现这种统一,清单的含义必须大量超载。它们可能是函数调用、分组结构或数据文字等,并确定哪些需要使用上下文,在扫描代码以评估其含义时增加认知负荷。Clojure将更多的复合数据文本添加到列表中,并将它们用于语法。这样做意味着列表几乎总是类似调用的东西,向量用于分组,而地图有自己的文字。从一种数据结构转变为三种数据结构大大减少了认知负荷。“

他认为标准语法中超载的一件事是访问时间。因此,参数中的向量语法与使用它们时的常量访问时间有关。他说:

但是,似乎很奇怪,因为它只在一个form...as存储在变量中或以任何方式传递信息“丢失”时才对它有效。例如..。

代码语言:javascript
复制
(defn test [a]
  (nth a 0)) ;;<- what is the access time of and element of a?

我个人更喜欢苛刻的语法修改,比如括号,以便在程序员不得不转换心理模型时使用,例如嵌入式语言。

代码语言:javascript
复制
;; Example showing a possible syntax for an embedded prolog.

{size [],0}
{size([H|T],N) :- size(T,N1), N is N1+1}

(size '(1 2 3 4) 'n) ;; here we are back to lisp code

这样的概念在句法上是固定不变的。您不会在运行时“传递”结构。在运行之前(读取/宏/编译时间)是另一回事,因此,在可能的情况下,通常最好将内容保留为列表。

[edit]最初的消息来源似乎已经消失,但下面是另一个采访记录:https://gist.github.com/rduplain/c474a80d173e6ae78980b91bc92f43d1#file-code-quarterly-rich-hickey-2011-md

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29365000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档