【问题标题】:Beginner Scheme list print初学者方案清单打印
【发布时间】:2019-09-30 15:23:44
【问题描述】:

我正在使用 DrRacket 学习 Scheme,语言子集是球拍(#lang 球拍)。我有以下列表/表达式:

(cons (cons (cons 'a 'b) (cons 'c 'd)) (cons (cons 'e 'f) (cons 'g 'h)))

当我按下回车键时,我会打印出以下值:

'(((a . b) c . d) (e . f) g . h)

我希望结果是:

'((( a . b) (c . d)) ((e . f) ( g . h)))

谁能解释一下方案使用什么规则来决定以它的方式打印值?

附上也是终端的画面:

【问题讨论】:

  • 使用list而不是缺点,(list (list (cons 'a 'b) (cons 'c 'd)) (list (cons 'e 'f) (cons 'g 'h)))

标签: list printing scheme racket


【解决方案1】:

cons 创建一对,这也是一个列表。因此,当您稍后将 cons 其他内容添加到列表时,您可以扩展此列表。

(cons 'a 'b)
==> (a . b)

(cons 'c '(a . b))
==> (c a . b)

(cons 'd '(c a . b))
==> (d c a . b)

这就是当你 cons 新配对到另一个配对/列表时发生的情况:

(cons 'something '(c . d))
==> (something c . d)

(cons '(a . b) (c . d))
==> ((a . b) c . d)

有时将对绘制成框有助于查看发生了什么:

(cons 'a 'b)        (cons 'c 'd)
+---+---+          +---+---+
|   |   |--- b     |   |   |--- d
+---+---+          +---+---+
  |                  |
  a                  c

(cons (cons 'a 'b) (cons 'c 'd))
+---+---+    +---+---+
|   |   |--- |   |   |--- d
+---+---+    +---+---+
  |            |
  |            c
+---+---+
|   |   |--- b
+---+---+
  |
  a

要获得((a . b) (c . d)),您必须:

(cons (cons 'a 'b) (cons (cons 'c 'd) '()))
==> ((a . b) (c . d))

+---+---+        +---+---+
|   |   |------- |   |   |--- NIL/()
+---+---+        +---+---+
  |                |
  |                |
+---+---+        +---+---+
|   |   |--- b   |   |   |--- d
+---+---+        +---+---+
  |                |
  a                c

【讨论】:

  • 嘿,非常感谢,我决定将另一个答案作为正确的答案,因为这是 lisp/scheme 打印行为未按预期运行的实际原因。不过,你的回答也澄清了很多事情。
【解决方案2】:

你的表达结果是:

'((( a . b) . (c . d)) . ((e . f) . ( g . h)))

而不是

'((( a . b) (c . d)) ((e . f) ( g . h)))

如你所愿。

但是它不是以这种方式打印的,因为 lisp 语言的打印规则。参见例如this page(用于Common Lisp,但Scheme的打印规则相同):

请注意,LISP 以一种特殊的方式打印链表:它省略了一些 句点和括号。规则是:如果 cons 的 cdr 为 nil, LISP 不会费心打印句点或 nil;如果 cdr cons A 是 cons B,然后 LISP 不会费心打印 cons 的句点 A 或 cons B 的括号。所以:

(缺点 4 无)

(4)

(缺点 4(缺点 5 6))

(4 5 . 6)

(cons 4 (cons 5 (cons 6 nil)))

(4 5 6)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2020-05-13
    • 2017-08-10
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多