Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在LISP中将点对转换为两元素列表_Lisp_Common Lisp - Fatal编程技术网

在LISP中将点对转换为两元素列表

在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建立的。这是如何工作的,在很多地方都有描述,包括列表的答案要么是空

我是lisp新手,正在做一个家庭作业问题,以便将嵌套列表展平。我有我的功能,除了它需要'删除'点对工作。所以给定(1(23)(4.5)((67)(89)),我的函数应该输出(12345689)

所以。。我的实际问题


给定一个点对,例如
(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)