【问题标题】:Scheme: car and cdr方案:汽车和cdr
【发布时间】:2018-04-12 21:33:13
【问题描述】:

我正在读这本书: http://www.shido.info/lisp/scheme3_e.html

我坚持做这个练习:

(car '((1 2 3) (4 5 6)))

问题是,根据我的理解,我必须了解我们如何得到 ((1 2 3) (4 5 6)) 得到 (car '((1 2 3) (4 5 6))) 因为 car 计算第一个地址。

我尝试了几次,但无法得到确切的“字符串”(我什至不知道如何调用它们):

(cons (cons 1 (cons 2 (cons 3 '()))) (cons 4 (cons 5 (cons 6 '())))) 

给我

{{1 2 3} 4 5 6}

(cons (cons (cons 1 (cons 2 (cons 3 '()))) '()) (cons 4 (cons 5 (cons 6 '()))))

给我

{{{1 2 3}} 4 5 6}

(cons (cons (cons 1 (cons 2 (cons 3 '()))) '()) (cons (cons 4 (cons 5 (cons 6 '()))) '()))

给我

{{{1 2 3}} {4 5 6}}

至少我得到了两个部分的括号......

问题是,如果我每次调用car来获取第一个地址,我都需要在脑海中制定结果才能看到山的另一边,这似乎是一个非常对我来说很难语言...所以我希望我错了。

【问题讨论】:

  • 这似乎不是一本很好的书(例如,“地址”是一个您从未听说过与 Scheme 相关的词)。优秀的书籍Structure and Interpretation of Computer ProgramsHow to Design Programs 可以在线获取,它们都是你能找到的最好的编程书籍。
  • @molbdnilo 谢谢,我实际上正准备在此之后阅读 sicp。听说 sicp 没有教太多的语法,所以我拿了一本语法书。不过可能是错的。
  • Lisp 家族的语法非常简单;如果不涵盖所有内容,就不可能写一本书。我建议您从 HtDP 开始(它有点“友好”)或直接转到 SICP。它们都更容易阅读(它们是由母语是英语的专家编写的),包含的错误少得多,并且都包含许多有意义的练习。
  • @molbdnilo 啊,谢谢!将读取 SICP。

标签: scheme


【解决方案1】:

'((1 2 3) (4 5 6))(cons (cons 1 (cons 2 (cons 3 '()))) (cons (cons 4 (cons 5 (cons 6 '()))) '()))

> (cons (cons 1 (cons 2 (cons 3 '()))) (cons (cons 4 (cons 5 (cons 6 '()))) '()))
'((1 2 3) (4 5 6))

如果我们用符号替换内部列表,因为它们的值无关紧要,我们得到:

(car '((1 2 3) (4 5 6)))
(car '(X Y))
(car (cons 'X (cons 'Y '())))

通过减少(car (cons A B)) => A 产生'X 所以结果是(cons 1 (cons 2 (cons 3 '())))'(1 2 3)

【讨论】:

  • 感谢您的回复!这个解释消除了我的一些疑问,但我必须说总的来说我对括号仍然很困惑。例如,我不明白为什么它们会在每个结果中显示,cons 做了什么以及我们为什么需要它,很困惑。它似乎是一个列表,但我熟悉 C/C++ 列表,它带有一个指向下一个节点的指针和一个实际数据的容器。我会再读几章,看看我是否能更好地掌握这个概念。顺便说一句,我正在使用 DrRacket,所以我实际上看到的是卷曲。
  • 抱歉无法编辑之前的评论。我想到了大括号。如果它是 cons 则它有大括号。例如。 (car (cons (cons 1 '()) 2)) 给出 {1} 因为那是 cons,而 (car (cons 1 2)) 给出 1 因为那是 inside 的一个 cons。我认为括号是从构造本身告诉构造的 elements 的方式。现在如果我们回到原来的问题,{{1 2 3} {4 5 6}} 肯定有两个元素,第一个必须是 cons 因为 {1 2 3} 在大括号中, 和第二个是一样的。我仍然不明白为什么我的第一个答案没有给出正确的输出。
猜你喜欢
  • 2021-12-21
  • 2012-01-10
  • 2018-01-12
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多