首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常见的Lisp: first返回第一个,但last返回最后的列表--嗯?

常见的Lisp: first返回第一个,但last返回最后的列表--嗯?
EN

Stack Overflow用户
提问于 2013-07-19 02:53:47
回答 4查看 2.4K关注 0票数 6

我没有在Common-Lisp中得到这第一个/最后一个东西。是的,我知道它是如何工作的,但我不明白为什么它会这样工作。

基本上,要获取列表中的第一项,我可以使用(first mylist)。但是,如果我想要最后一项,(last mylist)不会给我;相反,它会给我一个列表,其中包含列表中的最后一项!

(我使用的是Clozure-CL,它还有其他一些奇怪的地方,在我看来像是bug,但是,因为我是Lisp-n00b,所以我尽量不去相信老话“解释器坏了!”技巧:)

所以,举个例子:

代码语言:javascript
复制
? (setq x '((1 2) (a b)))
=> ((1 2) (A B))

? (first x)
=> (1 2)  ; as expected

? (last x)
=> ((A B))  ; why a list with my answer in it?!

? (first (last x))
=> '(A B)  ; This is the answer I'd expect from plain-old (last x)

有人能告诉我为什么last会这样做吗?我是否错误地使用了这些项目?first真的是个怪人吗?!

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-19 03:14:13

在Common Lisp中,last应该从documentation返回一个列表

代码语言:javascript
复制
last list &optional n => tail
list---a list, which might be a dotted list but must not be a circular list.
n---a non-negative integer. The default is 1.
tail---an object. 

last返回列表的最后n个conses (而不是最后n个元素)。如果list为(),则last返回()。

例如:

代码语言:javascript
复制
(setq x (list 'a 'b 'c 'd))
(last x) =>  (d)

是的,这是违反直觉的。在Lisp的其他版本中,它的工作方式顾名思义,例如在球拍(一种方案方言)中:

代码语言:javascript
复制
(define x '((1 2) (a b)))
(first x) => '(1 2)
(last x) => '(a b)

(define x (list 'a 'b 'c 'd))
(last x) =>  'd
票数 8
EN

Stack Overflow用户

发布于 2013-07-19 03:58:29

除了访问最后一个元素之外,返回最后一个元素并不是很有用;返回最后一个cons可以让您执行以下操作:

代码语言:javascript
复制
(let ((x (list 1 2 3)))
  (setf (cdr (last x)) '(4))
  x)

=> '(1 2 3 4)

而您仍然可以将最后一个元素作为(car (last x))访问。

票数 7
EN

Stack Overflow用户

发布于 2013-07-19 03:17:46

Common Lisp的命名错误的函数last给出了最后一个cons

它可能应该被称为tail,因为有一个函数tailp,但我猜测这个名称是由于历史/兼容性原因而保留下来的。

通常,它会给出列表的第n个尾部,或者列表末尾之前的第n个cons。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17731670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档