2015-04-06 48 views
2
#lang racket 

我需要创建从一个元素的对和列表利弊两个元素输出错误的结果

但是当我做(cons 2 (list 1 2 3))我得到(2 (1 2 3)),我想(2 . (1 2 3)) 如何获取点在?

+2

随着'(2利弊(表1 2 3))'你不明白'(2(1 2 3))' – Sylwester

回答

3

由于(cons a b)相同(a . b)我们得到(2 . (1 2 3))相同(cons 2 (list 1 2 3)这是一样的(list 2 1 2 3)。为了证实:

> (cons 2 (list 1 2 3)) 
'(2 1 2 3) 

> '(2 . (1 2 3)) 
'(2 1 2 3) 

注意打印机打印(2 1 2 3)而不是(2 . (1 2 3))。只有在绝对需要时,打印机才会尝试使用该点。

2

解释结构的语法,它的存储方式以及display将如何表示它。

对于两个元素的列表,有两种方法可以代表它(1)(1 .())。当显示这个列表时,它总是会选择圆括号最少的列表。因此'(2 . (1 2 3))将始终打印为(2 1 2 3),display。如果你不想,你可以让自己cons-write,如:

;; displays cons always as dotted 
(define (cons-write x) 
    (if (pair? x) 
     (begin 
     (display "(") 
     (cons-write (car x)) 
     (display " . ") ; spaces are important 
     (cons-write (cdr x)) 
     (display ")")) 
     (write x))) 

(cons-write '(1 2 3 4)) ; prints (1 . (2 . (3 . (4 .()))))