Common Lisp:为什么数组文本不计算参数?

为什么公共Lisp数组语法不计算其参数: (let ((a 1)) #2A((a 2) (3 4))) => #2A((A 2) (3 4)) 我会猜它是#2A((12)(34))。这是因为A在读卡器时间不可用吗?简而言之,是的 #2A((a2)(34))不是(make array'(22):初始内容(list(list)(list a2)(list 34))的缩写(“语法糖”)。如果有的话,它可以合理化为(make array'(2 2):初始内容(quote((A 2)(3 4)),

Lisp中的回指条件句是什么?

Lisp中的回指条件句是什么?请解释一下代码 保罗·格雷厄姆的书中有一章是关于 本质上,它是一种编写语句的简写方法,可以避免重复代码。例如,比较: (let ((result (big-long-calculation))) (if result (foo result))) 及 其中,it是一个特殊名称,指的是刚刚在(大-长计算)中计算的内容。一个例子是常见的Lisp循环: (loop for item in list when (general-predicat

Lisp 如何解码mp3文件

如何使用lisp获取mp3文件的艺术家 (let ((in (open "test.mp3" :direction :input :element-type '(unsigned-byte 8)))) (when in (loop for line = (read-byte 'utf-8 in) while line do (format t "~a" line )) (close in))) 本书介绍了完整的ID3(MP3标

Lisp 比较集合的函数;有助于提高效率

我试图编写一个函数,比较两个列表,看看它们是否代表同一个集合。也就是说,‘abcdd’和‘dcbdad’代表同一个集合。元素可以是任意顺序 这就是我所拥有的,有效的: (defun samesetp (list1 list2) (cond ((null list1) (null list2)) ((eq list2 (remove (car list1) list2 :count 1)) nil) (t (samesetP (cdr list1) (remove (c

LISP如何适应业务挑战的示例

几乎每一位LISP爱好者都声称,该语言的一个关键优势是它可以适应问题,而不是将问题适应于该语言。我正在寻找现实世界中的例子,说明这在简单的商业软件或web应用程序领域是如何实现的。还有什么比DSL更重要的吗?是否有足够复杂/不明显的例子 PS:为什么我不能在标题中使用'problem'?是Paul Graham网站上的lisp应用程序列表。该页面包含来自许多不同领域的产品/公司 除此之外,雅虎!商店是基于lisp的(Graham的产品被雅虎收购)。谢谢罗伯特指出 我想下面的stackoverfl

clisp、普通odbc和连接到sql server数据库

我在使用unixODBC从openbsd盒连接到sql server数据库时遇到问题。当我使用isql时,我很好地通过了: $ isql localProdSqlServer jegdemir GBE#oct +---------------------------------------+ | Connected! | | | | sql-statement

Lisp 有关sw http中APPLICATION-FINDER-FN的详细信息

我想用CommonLisp做一些同步的web编程,我正在收集选项。其中之一是“为AJAX/Comet定制的HTTP服务器”。文档似乎有点缺乏,因为我能找到的唯一一篇文章告诉你 子类服务器,并将APPLICATION-FINDER-FN插槽设置为回调 这将生成您的内容 似乎没有任何关于回调应该是什么样子的注释或示例(一些prodding告诉我,它应该期望一个服务器和一个连接作为参数,但没有关于它应该返回或执行什么操作的说明) 将其设置为类似于 (lambda (server conn) (decl

公共Lisp类型声明未按预期工作

当我在Common Lisp中定义函数时,如下所示: (defun foo (n) (declare (type fixnum n)) (+ n 42)) 我期望像(foo“a”)这样的调用立即失败,但它在调用+时失败。declare表单不保证静态类型检查吗?声明只是对编译器的提示,因此它可以生成更高效的代码。换句话说,它不是静态检查。类型声明传统上是用来作为编译器优化目的的保证。对于类型检查,请使用检查类型(但请注意,它也在运行时进行检查,而不是在编译时进行检查): 也就是说,不同的

Lisp 在chicken方案中创建db

我想问,是否有可能在鸡只计划中设立db;类似于此: 如果是,那么我必须读取/搜索哪些谓词?我应该用鸡蛋吗? 在鸡肉维基中,我进行了搜索,但没有找到我搜索的内容。是无法在scheme中实现上述内容,还是以完全不同的方式实现?这是可能的,但您需要使用另一种数据类型 与Common Lisp(该书重点介绍)不同,Scheme没有plists,因为它们缺少:keyword包。您需要决定如何存储数据,该决定将影响您构建make-和select等价物的方式。例如,如果您认为alists是一个足够好的替代品

lisp do循环阶乘代码

我已经完成了上面的代码,当我尝试时,fact(4),它给了我ans是6。我不确定出了什么问题。有人能帮我吗 更改为 (defun fact (n) (do ((i 1 (+ 1 i)) (prod 1 (* i prod))) ((equal i n) prod))) 基本上,您只进行了一次不必要的迭代。更改为 (defun fact (n) (do ((i 1 (+ 1 i)) (prod 1 (* i

Lisp Scheme中的列表操作

可能重复: 我只是想把‘abcde’变成‘abcde’ i、 例如,将内部列表的每个成员插入外部列表,同时保持元素的顺序 要做到这一点,必须有一个简单的方法,但不知什么原因,我找不到。你看到‘a b c d e是一棵树,不是吗?差不多 a---b |\--c--d \--e 在此表示中,节点是列表,叶是符号。 你能做的是,它打印出树的所有叶子: 如果树为空=为空列表,则停止 如果树不是空的,那么 如果树的汽车是一个符号,请打印它,然后处理树的CDR 如果树的车是列表,则处理树的车,然后处

如何在XLISP中请求用户输入?

我正在用XLISP编写一个程序,它需要我询问用户输入。我用过C语言,它相当简单,但我对LISP,尤其是XLISP还不熟悉,这使得为它寻找合适的东西有点困难。我想在XLISP中编写的内容如下: scanf("Enter your position: %d %d\n",pos1,pos2); 如何在XLISP中写入此项?最基本的功能是带有程序块(指令列表)的函数输入位置,例如: (输入可能需要通过辅助函数进行消毒,但这是故事的另一部分) 这两个变量pos1和pos2将具有“词法范围”,因此它们在e

Lisp 在方案上显示/读取/读取行/etc程序

我正在学习这个计划,并用一些例子来说明它的工作原理 我正在使用Eclipse的鸡肉解释器 尝试运行以下代码时: (define (bottles n) (if (= n 0) 'burp (begin (verse n) (bottles (- n 1))))) (define (verse n) (show (cons n '(bottles of beer on the wall))) (show (cons n '(bottles o

Lisp中递归函数调用的堆栈溢出

我从康拉德·巴尔斯基的《Lisp之地》一书中学习Lisp。现在我遇到了我的第一个绊脚石,作者说: 用这种方式称呼自己不仅在Lisp中是允许的,而且通常是不允许的 极力鼓励 显示以下示例函数以计算列表中的项目后: (defun my-length (list) (if list (1+ (my-length (cdr list))) 0)) 当我用一个包含一百万项的列表调用这个函数my length时,我得到一个堆栈溢出错误。所以,要么你永远不会期望在Lisp中有这么长的列表

Lisp中的关联列表-从

在Common Lisp中,是否有方法从alist中检索与给定键匹配的所有条目?如果您有一个关联列表a: (defvar a '((a 1) (a 2) (b 1))) 通过调用remove if not(如果不是),可以保留所有具有a汽车的配对: (remove-if-not (lambda (x) (eq (car x) 'a)) a) 这导致: ((A 1) (A 2)) 即使将其视为assoc列表,也只会返回其中的第一个列表 (remove 'a '((a 1) (a 2) (b

什么是Common Lisp中的可移植外部程序调用库?

在Common Lisp中,什么是事实上的可移植外部程序调用库 我找到了两个这样的图书馆 执行人 外部程序 还有其他东西吗?新版本的ASDF附带了运行程序(请参阅) 在ASDF3中,有一个专门用于此类可移植性实用程序的包,称为uiop

公共Lisp中的逗号

我不知道逗号是怎么起作用的 中有一个使用逗号的示例 在我看来 (let ((parms '(x y))) ``(beg ,,@parms end)) 扩展到或等同于 `(beg ,x ,y end) 它是如何扩展到这一点的 我在想,如果我计算双反引号表单,它会导致第二个逗号起作用,结果是: `(beg ,<splice stuff here> end) 它可能会说:“我不知道在反向报价之前拼接东西意味着什么。永远不要再这样做。” 但不知何故,口译员并不抱怨,只是选择这样做

Lisp变量不递增?

如果其他地方已经回答了这个问题,我提前表示歉意,但是我似乎找不到对我所遇到问题的详细解释。这也是我的第一篇文章,所以 基本上这是一个家庭作业,然而,我不是在寻找一个解决方案,因为我已经看到了一个这样的工作解决方案。坦白地说,我想实现我自己的解决方案,这样我就可以学习了,因为我对lisp/scheme非常感兴趣。其思想是计算列表中有多少个0或任何元素/原子,然后显示/返回 我确信通过查看代码,很容易看到我的逻辑在做什么。我遇到的问题是每次递归时增加totalZeros变量。(+5 myNum)肯定

Lisp 如何测试一个列表是否是另一个列表的成员

假设我有两个列表,((123))和((123))((45))。我想知道第一个列表是否是第二个列表的成员。我尝试使用subsetp,但对于此查询,它不会返回true。如何实现这一点?如果要将列表作为子TP的集合元素,必须更改:test关键字的值 CL-USER 1 > (subsetp '(1 2 3) '(1 2 3 4 5)) T CL-USER 2 > (subsetp '((1) (2) (3)) '((1) (2) (3) (4) (5))) NIL 第一个给T,第二个给零

Lisp 这是文字cons的特定于实现的行为吗?

我正在测试中的代码 由于行为不同,我想知道SBCL是否使用了上述警告将行为更改为它认为用户更可能期望的行为?预期: TEST> (defun literal-cons () (let ((cons '(1 . 2))) (incf (cdr cons)) cons)) LITERAL-CONS TEST> (literal-cons) (1 . 3) TEST> (literal-cons) (1 . 4) TEST>

Lisp ~A in格式中的A代表什么?

使用format可以使用~S和~A 虽然~S中的S代表S-expression,但~A中的A代表什么?显然,它输出时没有逃逸,但我想知道这个字母到底是什么意思…?它代表美学未转义格式化的输出。看 顺便说一句,S代表标准而不是S-expression。我投票将这个问题作为离题题来结束,因为这表明没有任何研究成果,相关文档的标题对此进行了回答。尽管我是这个问题的作者,但我必须同意。我没有想到超规范,也没有想到如何用谷歌搜索这个术语。也许我应该多考虑一分钟。对此很抱歉:-(这是一个诚实的错误,事后来看

如何在Common Lisp中设置函数

在Common Lisp中,我可以使用#“语法传递函数,如下所示: (let ((x #'+)) (funcall x 1 2)) (flet* ((x #'+) (y #'*)) (pprint (x 1 2)) (pprint (y 3 4)) (pprint (x (y 2 3) 4))) 但是假设我想设置一个函数,这样我就不必为它使用funcall。Common Lisp是否有一个本地函数名表,或者仅仅是通过defun分配给

Clisp";程序堆栈溢出。重置";在(cadr)上。怎么用?

我(仍然)在将代码从franzlisp移植到commonlisp。现在,我似乎把翻译推进了一个奇怪的角落,在那里它爆炸了 [11]> (setq fff (cadr contextstack)) *** - Program stack overflow. RESET 那怎么会导致堆栈溢出呢?递归在哪里 我可以选择长度确定: [12]> (length contextstack) 79 描述工作原理。这只是长时间“描述”输出的开始 [13]>(描述(cadr上下文堆栈))

LISP编程 (解除气泡(n) (续) ((空n)无) ((空(cdr n))n) ((>(汽车n)(汽车cdr n))) (附加(列表(car(cdr n))) (布布卢普(cons(car n))(cdr(cdr n(()))) (t)(附加(列表(车辆n))(bubbleUp(cdr n‘‘‘‘‘‘‘)’)

我想写一个使用这个bubbleUp函数的排序函数 调用sort将输出以下内容: >(排序’(54321))>(12345) >(排序(64398)) > (3 4 6 8 9) 但我只想使用LISP函数:defun、cond、car、cdr、list、cons、append、>、=、,据我所知,您必须再次应用冒泡(这是一种更简洁的函数命名方式),直到(应用#' (1 3 4 6 8 9 10 12) 但是请注意,我不是一个非常有经验的Lisp程序员,而且这段代码非常低效。如果您真的想对列表进

Lisp 从其他列表中从列表中删除

我有包含其他列表的列表(仅2级) 如何从包含一些对的列表中删除列表,第一个位置上的2个元素的相同组合和列表中的第二个位置或第三和第四个位置(在我的示例中为“SU”),并返回((SU S R)(SU R)) 我需要改变 ((susr)(susr)(surr))to=>((susr)(surr)) ((su R S U)(su S R)(su R))to=>((su R S U)(su S R)(su R))-不要更改,因为这里有两次或两次以上的对有su、rs、U和no su 小心: (subseq

寻找一个程序,可以帮助我生成一个lisp程序的代码行每函数统计

我正在寻找的程序,可以为我生成一个lisp程序中每个函数的代码行统计信息。在Lisp中,这意味着每个函数或宏都要计算顶级函数中递归包含的函数数 任何指针都将不胜感激 为每个函数或宏计算顶级函数中递归包含的函数数 我不知道这意味着什么 如果要计算代码中函数调用的数量,则需要一个完整的函数调用 然而,对于文件中顶级表单数量的简单含义来说,这个问题相当容易处理。 我不知道有哪一个现有的项目能做到这一点,但这听起来并不难: (defun read-file-as-string (file-name)

Lisp 如何将行读取为简单的基字符串?

那么,下面的代码 (取消读取8位行(路径) (打开文件时(流路径:元素类型'base char:外部格式:ascii) (环路 对于行=(读取行流nil) 边线 收集线) 以字符串列表的形式读入文件,字符串类型为SIMPLE-ARRAY-CHARACTER。我想要的是SIMPLE-BASE-STRING。我可以通过强制执行: (取消读取8位行(路径) (打开文件时(流路径:元素类型'base char:外部格式:ascii) (环路 对于行=(读取行流nil) 边线 收集(强制行“简单基字符串

为什么下面的lisp代码没有给出期望的结果

我有一张单子 '((1 2 (A B C)) (2 3 (B C D)) (4 5 (C D F))) 我想处理内部列表中的元素,在本例中,我想将abc和其他列表更改为M 我编写了一个代码进程lst,它将为内部列表执行此任务 (defun process (lst) (cond ((null lst) '()) (T (cons 'M (process (cdr last)))))) 当我从主函数调用时 (defun iterate-list (lst) (cond

什么';Lisp有多棒?

我的口齿不清,说不出是好是坏。似乎每个使用过Lisp的人都喜欢它,然而现在最流行的语言是C语言的后裔 那么Lisp有什么了不起的地方,为什么它没有被更多地使用呢?Lisp有什么不好的地方吗(除了不断增加的括号)?这里有一些有用的链接: (一些快速要点) (起步缓慢,但重点突出) (一整本书) 这本书涵盖了他喜欢Lisp的原因。底线是短语“可编程编程编程语言”——根据您的领域或首选风格定制语言的能力。Lisp是编程语言的Chuck Norris Lisp是衡量其他语言的标准 了解Lisp说明了

Lisp “到底是什么?”;“计算机程序的结构和解释”;封面画什么?

封面画到底是关于什么的?我的意思是,我知道“eval”、“apply”和“λ”都是什么意思,但我很难理解图片的其余部分 这姑娘究竟是谁?她为巫师工作吗?她为什么指着桌子?她是指那个碗状的东西吗?还是书?还是整个桌子?她是否试图告诉向导他应该对表或表上的项目应用某种Lisp向导?还是她只是告诉他一些平淡无奇的事情,比如他的食物变凉了 那张桌子上的一条腿到底是什么样子的…一条腿…末端有一只脚(腿通常都有)?这张桌子单腿是如何保持平衡的?(或者那是阴影中的另一条腿?) [注意:我正在等待一个漫长的构建

Lisp 如何检查Scheme中是否存在变量?

有没有办法检查Scheme中是否存在变量?即使执行(if variable)或(null?variable)之类的操作也会导致错误,因为变量未定义。是否有返回变量是否存在的函数?根据R6RS,调用未绑定变量是违反语法的 但是,根据您的实现,应该有一种方法(至少在理论上)来查询环境并检查变量是否是成员。然而,你需要做一些进一步的阅读 这里有一个关于球拍的例子: #lang racket (define x 1) (define-namespace-anchor ns) (define (is-b

使用带有公共Lisp的排序时出现意外列表重复

编辑:解决方案是在第一个(let…)表单中将“(1)替换为(列表1)。这是因为我试图修改文字数据。谢谢你的帮助!(我会放弃投票,但显然你需要15个声誉…) 这是我在这个网站上的第一篇帖子 今天我在解决一些问题时,在Common Lisp中遇到了一些意想不到的列表排序行为(至少对我来说是这样): 我有一个函数,可以找到一个数x的所有适当因子: (defun divisors (x) "Finds all of the proper divisors of x." (let ((sq

Lisp 堆栈弹出不返回

我正在努力扩展并学习lisp。其中一个基础是实现一个简单的堆栈。除了我的pop功能外,一切都正常 ;Returns and removes the first element of the stack (defun my-pop () (let (temp (car *stack*)) (setq *stack* (cdr *stack*)) temp)) 这将正确删除堆栈的“顶部”,但不会返回它。早些时候,我有一个: ;Returns and removes the

如何编制,;运行用T(Lisp的方言)编写的程序

我想编译并运行一个80年代用T编程语言(Lisp的一种方言)编写的程序。我检查了,但它似乎只适用于VAX机器(和附带的编译器) 有没有什么适合T的现代CMPILER?或者一些兼容的现代方言?这列出了T已移植到的以下平台: Ultrix(vax) 阿波罗域名/操作系统(m68k) HP/UX(m68k) Mac/AUX(m68k) 下一个(m68k) SunOS 3(m68k) SunOS 4及以上版本/Solaris(sparc) Encore Multimax(n32k) DEC3100(p

Lisp 方案何时评估报价?

(car“abracadabra)相当于(car(quote(quote abracadabra)),其计算结果为(car(quote abracadabra))-->quote 另一方面,(car(引用(ab))的计算结果是a,这对我来说很直观 所以我的问题是,为什么Scheme不评估(car(quote(quote abracadabra))(即评估(car(quote abracadabra))到(car abracadabra)),而是评估(car(quote(ab))(即,为什么答案不

Lisp 尝试Euler#2后出现Bignum溢出错误

我尝试使用以下尾部递归函数进行求解: (defun fib (num) (labels ((fib-helper (num a b) (cond ((or (zerop num) (eql num 1)) a) (t (fib-helper (decf num) (+ a b)

lisp中循环列表的长度

从“lisp的温和介绍”开始: 如果给定循环列表,如#1=(a B C.#1#)作为输入,则长度可能 根本不返回值。在大多数实现中,它将进入一个 无限循环 这仍然是真的吗?这是一个bug吗?为什么不先检查一下列表的性质呢?一般用于处理序列;循环性问题与列表相关,但与字符串或数组无关。专门用于列表,并按预期用于正确的列表,但对于循环列表返回nil 在R7RS Scheme和Common Lisp等现代实现中,它们确实识别循环列表,但为了减少开销,CL既有长度,可能会挂起,也有可能在检测到循环时返回

Lisp-附加到列表

我是lisp的新手。我没有正确理解如何在列表上实现append函数。我尝试了以下程序 (defvar temp) (setq temp '()) (append temp (logxor 1 0)) 当温度应该存储1时,它似乎只存储零值 返回新值,但不修改其参数。 您需要使用: 或者(这会添加到列表的开头,而不是结尾!): 返回新值,但不修改其参数。 您需要使用: 或者(这会添加到列表的开头,而不是结尾!): (setq temp (append temp (list 1))) (push

EVAL:Lisp中未定义的函数NIL

我正在尝试编写一个名为calculate的函数,它获取一个列表作为输入,并计算其值(用作lambda演算减缩器) 这是我的密码: (defun substitue(x y z) (cond ((atom z) (cond ((eq z y) x) (T z))) (T (cons (substitue x y (car z)) (substitue x y (cdr z)))))) (defu

唐´;我不知道如何将prolog规则翻译成lisp

嗨,我在Prolog中的一个简单的专家系统中工作,基于事实和规则 我遇到的问题是,我需要将prolog代码翻译成Lisp。我已经做了事实,但不知道如何做规则。我如何翻译这句话: gimnosperms(Y):-植物(Y),带有种子(Y)。两种语言之间几乎不可能直接翻译,因为它们具有非常不同的语义 在lisp语言中定义函数,即“机器”,给定特定输入,产生特定输出 在Prolog中,您可以通过规则和事实定义具有不同用途的关系: 作为谓词,当您向它们传递一个或多个常量值时,查看它们是否满足指定的条件(

通用lisp sbcl手动ffi示例失败

我阅读了8.5国外数据结构示例一章,发现有问题。 我使用以下示例来验证它是否可以正确运行。 _______________________________________________________________ 或考虑一个外部C变量的例子和一些访问: struct c_struct { short x, y; char a, b; int z; c_struct *n; }; extern struct c_struct *my_struct; my_

如何在common lisp中进行动态加载(load)

我下面的代码片段将给出SB-INT:SIMPLE-READER-PACKAGE-ERROR; 我知道这是因为在REPL读取代码时还没有定义包“quicklisp quickstart”;但是包是在“quicklisp.lisp”中定义的 如何使以下代码正常工作? 或者,我如何告诉公共lisp读取器这个包将在动态加载的文件中定义 * (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"

检查lisp中是否存在项

为了完成一个练习,我需要检查一个元素是否在列表中。我知道lisp中有函数成员,但我们的讲师非常严格,不允许我们使用课程中尚未涉及的内容 如果只使用cond、nil、car、not、cdr、+、equal、defun来检查原子是否在列表中,有什么方法 编辑: 在多塞克的评论之后;以下是一个尝试: (defun presence (list item) (cond ((atom list) nil) ((equal (car list) item) t) (

LISP生成路径名:非法:目录参数

我下载语义网络处理器项目: 接下来是读我的书, 通过使用CLISP解释器,我将目录更改为文件夹, 并执行以下操作: [3]> (load "snp-loader.lisp") ;; Loading file snp-loader.lisp ... ;; Loaded file snp-loader.lisp T [4]> (in-package "USER") <PACKAGE COMMON-LISP-USER> [5]> (snp-load-everyth

Lisp `即使列表中存在字符串,member`也返回'NIL'

公共口齿不清 我试图确定给定列表中是否存在字符串 我的目标是 (会员搜索字符串我的列表) 但是我总是得到零 为什么(成员“foo”(“foo”“bar”)返回NIL 这是因为(eql“foo”“foo”);=>无。虽然CLHS中没有记录,但使用#eql作为标准测试。为了使它能够使用同样计算结构的#'equal (equal "foo" "foo") ; ==> t (member "foo" '("foo" "bar") :test #'equal) ; ==> ("foo" "ba

在公共Lisp中合并保持大小写的符号

在我的代码中,符号必须区分大小写: (eq 'p 'P) nil 所以我补充说: (setf (readtable-case *readtable*) :invert) 在文件的开头,它工作得很好 但我也必须用两个符号做一个符号(合并它们) 为了“合并”两个符号,我找到了以下函数 (): 有效但无法维持案例: CL-USER> (symbol-append 'K 'm) KM 如何在维护案例的同时合并两个符号 编辑 “某个符号”成功了,但我不得不后退 (setf (readtable

Lisp 如何修改函数中的列表

如何让它像这样工作:(读取列表在某种程度上就像读取字节一样工作: 1.返回读取(并在此处解析)的值 2.更改流位置(此处为列表)) 或者更确切地说,你是如何处理这类任务的?您是否将列表转换为其他类型?我不太确定您想要的是什么,但这里有一个创建“列表阅读器”对象的函数(只是一个函数)。列表阅读器将允许您读取列表的块,将其视为一个流 (let ((obj) (data)) (setf data '(1 2 3 4 5 6 7 8) obj (foo (make-ins

Lisp 用于传递函数的def参数vs defun

所以我可以这样做: (defparameter*某些函数*…;稍后返回lambda 或者这个: (取消某些功能… 使用任一选项,我都可以使用funcall: (funcall'某些函数… 或 (funcall*某些函数* 使用defun版本,我还可以执行以下操作: (某些功能… 我无法使用defparameter函数实现这一点 defparameter为以后将某些函数重新分配给不同的函数(或任何其他函数,包括非函数数据)提供了更简单的技术 但是,除了这两点之外,还有什么其他的考虑因素是使用一个而

  1    2   3   4   5   6  ... 下一页 最后一页 共 27 页