scheme r5rs中如何表示如下数据结构
How to represent the following data structure in scheme r5rs
在Python中,数据结构如下所示:[([1 2 3], [8 9 10])]
(一个元组列表,其中元组的大小为 2,每个元组元素又是一个列表)
我如何在 Scheme r5rs 中表示相同的内容?
这是我试过的:(list (cons `(1 2 3) `(8 9 10)))
但是 运行 (display (list (cons `(1 2 3) `(8 9 10))))
给出 (((1 2 3) 8 9 10))
而我想要 (((1 2 3) (8 9 10)))
编辑
仅使用列表(根据@Will Ness 回答 ):
(list ; a pair of elements,
(list 1 2 3) ; 1 each is itself
(list 8 9 10))) ; 2 a list
有效。
我可以通过以下方式访问元组的第二个元素
(cadr (car x))
给出 (8 9 10)
(这是正确的)
我只是在想如何使用 cons
构建它,因为我的元组将只包含 2 个元素,据我所知 cons
用于表示 Scheme 中的一对。关于如何使用 cons
?
执行此操作的任何想法
[([1 2 3], [8 9 10])]
(a list of tuple, where tuple is of size 2, and each tuple element is a list again)
(list ; a list of
(list ; a pair of elements,
(list 1 2 3) ; 1 each is itself
(list 8 9 10))) ; 2 a list
Scheme 是无类型的,所以我们可以只使用元组的列表。这种方式更简单——访问是统一的。第一个是car
,第二个是cadr
.
你的方法也对。真正决定它是否存在的是您如何访问您的数据以检索其成分。按照您的方式,您确实也可以:第一个元素将是 car
,第二个元素是 cdr
.
(问题编辑的更新:)无论您使用 (cons 1 (cons 2 '()))
还是 (list 1 2)
都无关紧要。内存中的结果结构是相同的。
表示数据的方式有无数种。已经向您介绍了一种方法。这是另一种方式:
(define mk/data
(lambda (a b)
(lambda (?)
(cond ((eq? ? 'repr) (list (list a b)))
((eq? ? 'first) a)
((eq? ? 'second) b)))))
(define data/test (mk/data '(1 2 3) '(8 9 10)))
(data/test 'repr)
(data/test 'first)
(data/test 'second)
这是大系统实际表示数据的另一种方式。
在Python中,数据结构如下所示:[([1 2 3], [8 9 10])]
(一个元组列表,其中元组的大小为 2,每个元组元素又是一个列表)
我如何在 Scheme r5rs 中表示相同的内容?
这是我试过的:(list (cons `(1 2 3) `(8 9 10)))
但是 运行 (display (list (cons `(1 2 3) `(8 9 10))))
给出 (((1 2 3) 8 9 10))
而我想要 (((1 2 3) (8 9 10)))
编辑
仅使用列表(根据@Will Ness 回答
(list ; a pair of elements,
(list 1 2 3) ; 1 each is itself
(list 8 9 10))) ; 2 a list
有效。
我可以通过以下方式访问元组的第二个元素
(cadr (car x))
给出 (8 9 10)
(这是正确的)
我只是在想如何使用 cons
构建它,因为我的元组将只包含 2 个元素,据我所知 cons
用于表示 Scheme 中的一对。关于如何使用 cons
?
[([1 2 3], [8 9 10])]
(a list of tuple, where tuple is of size 2, and each tuple element is a list again)
(list ; a list of
(list ; a pair of elements,
(list 1 2 3) ; 1 each is itself
(list 8 9 10))) ; 2 a list
Scheme 是无类型的,所以我们可以只使用元组的列表。这种方式更简单——访问是统一的。第一个是car
,第二个是cadr
.
你的方法也对。真正决定它是否存在的是您如何访问您的数据以检索其成分。按照您的方式,您确实也可以:第一个元素将是 car
,第二个元素是 cdr
.
(问题编辑的更新:)无论您使用 (cons 1 (cons 2 '()))
还是 (list 1 2)
都无关紧要。内存中的结果结构是相同的。
表示数据的方式有无数种。已经向您介绍了一种方法。这是另一种方式:
(define mk/data
(lambda (a b)
(lambda (?)
(cond ((eq? ? 'repr) (list (list a b)))
((eq? ? 'first) a)
((eq? ? 'second) b)))))
(define data/test (mk/data '(1 2 3) '(8 9 10)))
(data/test 'repr)
(data/test 'first)
(data/test 'second)
这是大系统实际表示数据的另一种方式。