【问题标题】:Do you have a mnemonic for remembering the meaning of car and cdr?你有记住car和cdr含义的助记词吗?
【发布时间】:2010-11-21 04:19:36
【问题描述】:

我的大部分 Lisp 经验来自 Elisp。因此,我发现自己只是偶尔写 Lisp。当我回过头来时,我经常忘记carcdr 之间的区别,需要参考文档来记忆。

您使用哪些聪明的助记符来记住命名根源自 1954 era computer architectures(car、cdr、cadr、caar、cddr 等)的 Lisp 函数之间的区别?

此外,为什么 firstrest 的知名别名作为 carcdr 的惯用替代品没有获得更多关注?

更新:我知道car and cdr 的实际定义以及它们应该如何发音。请只使用助记符。

完全披露:这个问题并不完全适合我。这是为了帮助其他 Lisp 新手克服一些最初的障碍。

【问题讨论】:

  • 以防万一——如果您将它们阅读为 c.a.r 和 c.d.r,它们会让人感到困惑。它们的发音通常不同,大致为“car”和“kooder”。
  • 我不久前读过的 Lisp 风格指南推荐 first 和朋友,restnth 用于列表操作,c[ad]+r 用于树。

标签: lisp elisp common-lisp


【解决方案1】:

carcdr这两个词中,car是我第一次听到

【讨论】:

    【解决方案2】:

    这真的很蹩脚,但因为没有其他人提出任何建议......

    对我来说,汽车是开车的东西,所以它是第一位的。 cdr 是守车;它紧随其后。

    看,我告诉过你这是蹩脚的。

    【讨论】:

    • 至少你提出了一些建议。这正是我想要的。
    【解决方案3】:

    我没有记住 car/cdr 的助记符,尽管它们是按字母顺序排列的(ad 之前,因此 carfirst)。

    至于为什么他们坚持(像firstrest这样的东西)?很大一部分可能只是动力,但另一部分是你已经写的。您可以轻松地为它们编写组合函数:

    (caadar ...) -> (car (car (cdr (car ...))))
    

    【讨论】:

    • 我认为在 SICP 视频中,他们还提到了另一个不明显的优势:您可以在电话中说“cadaddr”,它立即可以理解,明确且非常有效。如果您改为说“firstcdrcarcdrcdrfirstrestfirstrestrest”这会慢得多,更难正确理解,并且可能需要其他人在你说的时候同步写下来。 OTOH,没有什么能阻止你 caadar 和另一个人writing (car (car (cdr (car …))))
    • aargh 我搞砸了。我的意思是:没有什么能阻止你 caadar 和其他人写作 (head (head (tail (head …))))(first (first (rest (first …))))
    • 谢谢。我也考虑过按字母顺序。
    • 如果有人在电话里对我说“cadaddr”,我会担心他们被什么东西噎住了。
    • @TreyJackson 我的意思是 (defstruct (person (:type list)) ...) 使用结构类型,但使用列表,并自动创建那些 person-age 等函数。问题不是关于抽象,而是您之前的评论说“Lisp 是关于列表的,将它们用作数据结构是很自然的。” 没错,但是当使用列表作为实现 对于数据结构,正确定义抽象仍然是一种好习惯,即使这些方法只是 carcadr 等和 CL 的瘦包装器为此提供了很多工具。
    【解决方案4】:

    它们代表“地址寄存器的内容”和“递减寄存器的内容”,这些术语源自 IBM 704 机器架构。并不是说这对你有多大帮助!

    http://www.iwriteiam.nl/HaCAR_CDR.html

    【讨论】:

    • 这不是真正的助记符,因为 address=first 和 decrement=last 没有任何助记符。
    • “地址寄存器的内容”至少有点助记符,
    【解决方案5】:

    我没有 car 和 cdr 的助记符。我的意思是,只有他们两个,如果你使用 Lisp,在我看来你会 Just Know。 (见鬼,我什至不使用 Lisp,我记得。)

    除了方便组合之外,car 和 cdr 相比 first 和 rest 有以下优点:(1) 更短,(2) 长度相同,(3) 它们出现得更早。

    【讨论】:

      【解决方案6】:

      “car”和“cdr”,至少对我来说,是你刚学会的东西,就像“left”和“right”这两个词的发音。

      "first" 和 "rest" 只有在被解构的对象是一个列表时才有助记作用。如果它是一个实际的缺点(即,一个虚线对),它们没有帮助。

      他们之所以停滞不前,是因为几乎 50 年前,当 LISP 首次开发时,没有别的东西了。所有的文章,所有的书籍,所有的代码都使用了CAR和CDR,大家都习惯了。

      【讨论】:

      • 在 Elisp 中,firstrest 只是在 cl 包中定义的 carcdr 的别名。
      【解决方案7】:

      如果您不在乎惯用语,请先使用然后休息。 car 和 cdr 确实具有能够组合成诸如 caddr cddr 等组合的优点,如果您觉得这很有用的话。

      否则,汽车是第一个,并且它是两者中的第一个。

      【讨论】:

        【解决方案8】:

        你可以通过使用 first and rest 来避免这个问题。

        【讨论】:

          【解决方案9】:

          我使用的助记符是:

          CAR - 复制 Alpha 位置并返回

          CDR - 复制 Dendrite(树部分 - 没有根)并返回

          我最近重新开始尝试 Lisp,但希望这适合。

          我倾向于将列表的开头视为 alpha 或根位置。

          如果第一个位置是根,并且我习惯于看到二叉树(可以表示为列表),那么与树相关的单词似乎是有序的。 Dendrite 有正确的开头字母,似乎很合适。它表示没有根的树的最后一个。

          罗伯特·史密斯的另一个观点:

          CAR - “细胞的前部区域”

          CDR - “细胞的背侧区域”

          “我们可以得到细胞的第二部分。让我们称这部分为背侧区域(为什么不后侧?背侧的含义在列表中更有意义,因为列表的背侧区域 [1,2,3 ] 是“接近尾声”的部分,[2,3],而后面的只是 3)。”

          来自 Lisp 的括号太多……(……或者他们是这么说的!)作者:Robert Smith,2010 年 11 月 7 日

          Symbo1ics

          我知道这与最初的首字母缩略词无关,但即使是 Steve Russell 也说过:

          “由于不幸暂时失去灵感,我们想不出除了“地址”和“递减”之外的任何其他名称,因此我们将“地址内容”的函数称为 CAR of Register" 和 CDR 为 "Contents of Register of Register"。

          几个月后,在 LISP 中开设了几节课后,我们意识到“first”和“rest”是更好的名称,我们(John McCarthy、我和 AI 项目的其他一些人)试图让人们改用它们。

          唉,太晚了!我们根本无法让它坚持下去。所以我们有 CAR 和 CDR。”

          The origin of CAR and CDR in LISP

          【讨论】:

          • 更好的复制 Alpha Return,复制 Dendrite Return
          【解决方案10】:

          “Lisp 的简单介绍”这本书很好地解释了像

          这样真正的大问题

          CADDDAADDR

          从右侧开始向左(ADDDAADD),所以上面是(-> 是“then”):CDR->CDR->CAR->CAR->CDR->CDR->CDR->CAR

          CARCDR 优先于 firtrest 的原因是(我认为)因为它们可以链接起来形成上述函数。

          【讨论】:

            【解决方案11】:

            我实际上很少在代码中看到carcdr,更多的是我看到firstrest。所以我不能同意那些被点名的人没有获得关注。

            【讨论】:

            • Clojure 甚至没有 carcdr 了。
            • 有趣。好资料。不过,carcdr 在 Elisp 社区中确实显得更普遍。可能是因为所有的旧包。
            【解决方案12】:

            对上述书籍的完整参考是 David S. Touretzky 的“Common Lisp A Gentle Introduction to Symbolic Computation”。可从以下位置获得(2019 年 11 月): https://www.cs.cmu.edu/~dst/LispBook/book.pdf

            我(很晚)对 CAR 和 CDR 助记符的建议是:

            想想由 CAR 获得的列表的第一个元素,用 A 表示,但其中一种字体看起来像 D 的镜像。这个字符指向(即字符的曲面指向)' C'omentmence 的列表。然后想想 CDR 获得的列表的其余部分,用 D 表示。D 指向列表后面的“R”或余数。

            由于这里对字体的限制,我将使用'”表示 D 字符。

            关于 R = C^-1。然后 CARCDR=CAC^-1CDR=CADR 等由 CR = CR 等表示。

            【讨论】:

              猜你喜欢
              • 2010-12-04
              • 1970-01-01
              • 1970-01-01
              • 2011-07-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多