在LISP中将点对转换为两元素列表
我是lisp新手,正在做一个家庭作业问题,以便将嵌套列表展平。我有我的功能,除了它需要'删除'点对工作。所以给定(1(23)(4.5)((67)(89)),我的函数应该输出(12345689) 所以。。我的实际问题在LISP中将点对转换为两元素列表,lisp,common-lisp,Lisp,Common Lisp,我是lisp新手,正在做一个家庭作业问题,以便将嵌套列表展平。我有我的功能,除了它需要'删除'点对工作。所以给定(1(23)(4.5)((67)(89)),我的函数应该输出(12345689) 所以。。我的实际问题 给定一个点对,例如(1.2),如何获得列表”(1.2)?cons单元是一个由两部分组成的结构,称为其汽车和cdr。这对(1.2)是一个cons单元,其car为1,其cdr为2。LISP中的列表是由cons单元格和nil建立的。这是如何工作的,在很多地方都有描述,包括列表的答案要么是空
给定一个点对,例如
(1.2)
,如何获得列表”(1.2)
?cons单元是一个由两部分组成的结构,称为其汽车和cdr
。这对(1.2)
是一个cons单元,其car
为1
,其cdr
为2
。LISP中的列表是由cons单元格和nil
建立的。这是如何工作的,在很多地方都有描述,包括列表的答案要么是空列表()
(也称为nil
),要么是一个cons,它的car
是列表的第一个元素,而它的cdr
是另一个列表,是列表的其余部分。这意味着一份清单
(1 2)
由cons单元和nil
as构建
(cons 1 (cons 2 nil))
如果您已经获得了(1.2)
,那么您可以使用car
和cdr
获得1
和2
。你会像刚才描述的那样把它们重新组合起来。就是
(let ((x '(1 . 2)))
(cons (car x) (cons (cdr x) nil)))
或者,您可以只使用列表
:
(let ((x '(1 . 2)))
(list (car x) (cdr x)))
如果要重复使用同一cons单元,可以使用(cons 2 nil)
替换单元的cdr
。例如(请注意,我们不再引用该对,因为修改文字数据是未定义的行为):
这也可能是
(let ((x (cons 1 2)))
(setf (cdr x) (list (cdr x)))
x)
您还可以使用:
您可能想尝试使用CONS和LIST函数。还有一些其他有用的函数。你的讲座应该有一些指导。到目前为止,您尝试了什么?此外,如果您搜索,您将在此处找到许多相关的问题和答案。你可能会在这些东西中找到你想要的东西。显然,使用car和cdr是非常直接的。与我所学的所有其他语言相比,lisp上的文档非常少,这让我感到惊讶。@rcj实际上有很多文档;规范的超文本版本(HyperSpec)非常好。在这个例子中,你应该具体地看一下这一章,更全面地看一下。我想当我说文档时,我实际上是在说我有能力用谷歌搜索我的问题。我不只是挑选前几条谷歌搜索结果中的一条来回答基本问题,我还必须仔细筛选这些基本问题,并深入挖掘只有一半相关的问题,以获得我所需要的。
(let ((x (cons 1 2)))
(setf (cdr x) (list (cdr x)))
x)
(let ((x (cons 1 2)))
(rplacd x (list (cdr x)))
x)