首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通用Lisp中的循环列表

通用Lisp中的循环列表
EN

Stack Overflow用户
提问于 2013-05-21 19:54:05
回答 4查看 4.8K关注 0票数 11

我正在使用一个基于CL的音乐创作可视化编程环境。我试图创建一个函数,当给定3个元素(12,3)时,它将返回1、2、3、1、2、3等,每次计算时都返回一个数字。书Common是一个Gentle简介,简要地提到可以使用锐利相等的符号创建循环列表,但没有详细介绍如何使用它们。请记住,我可以使用专门为此设计的对象在程序中插入实际的Lisp代码。

EN

回答 4

Stack Overflow用户

发布于 2013-05-22 07:38:30

代码语言:javascript
运行
复制
CL-USER 3 > (defun circular (items)
              (setf (cdr (last items)) items)
              items)
CIRCULAR

CL-USER 4 > (setf *print-circle* t)
T

CL-USER 5 > (circular (list 1 2 3))
#1=(1 2 3 . #1#)

示例:

代码语言:javascript
运行
复制
CL-USER 16 > (setf c1 (circular (list 1 2 3)))
#1=(1 2 3 . #1#)

CL-USER 17 > (pop c1)
1

CL-USER 18 > (pop c1)
2

CL-USER 19 > (pop c1)
3

CL-USER 20 > (pop c1)
1

此外:

代码语言:javascript
运行
复制
CL-USER 6 > '#1=(1 2 3 . #1#)
#1=(1 2 3 . #1#)

加上一点克洛斯:

代码语言:javascript
运行
复制
(defclass circular ()
  ((items :initarg :items)))

(defmethod initialize-instance :after ((c circular) &rest initargs)
  (setf (slot-value c 'items) (circular (slot-value c 'items))))

(defmethod next-item ((c circular))
  (prog1 (first (slot-value c 'items))
    (setf (slot-value c 'items)
          (rest (slot-value c 'items)))))

CL-USER 7 > (setf circ1 (make-instance 'circular :items (list 1 2 3)))
#<CIRCULAR 40200017CB>

CL-USER 8 > (next-item circ1)
1

CL-USER 9 > (next-item circ1)
2

CL-USER 10 > (next-item circ1)
3

CL-USER 11 > (next-item circ1)
1

CL-USER 12 > (next-item circ1)
2
票数 18
EN

Stack Overflow用户

发布于 2013-05-21 21:25:39

尖头等号表示法中,它被写成#0=(1 2 3 . #0#)

下面是一个函数,它根据给定的参数创建这样一个列表:

代码语言:javascript
运行
复制
(defun circular (first &rest rest)
  (let ((items (cons first rest)))
    (setf (cdr (last items)) items)))

然后,调用(circular 1 2 3)将返回您想要的循环列表。只需使用carcdr来无限地迭代元素。

如果您真的想要一个迭代器函数,它不需要参数,并且返回每个调用的下一个项,那么下面是您可以这样做的方法:

代码语言:javascript
运行
复制
(defun make-iter (list)
  (lambda ()
    (pop list)))
票数 12
EN

Stack Overflow用户

发布于 2022-04-24 14:38:20

首先,您希望让打印机知道如何识别循环列表,而不是尝试打印整个列表:

代码语言:javascript
运行
复制
(setf *print-circle* t)

接下来,您可以使用尖头等号符号创建一个循环列表:

代码语言:javascript
运行
复制
(setq x '#1=(1 2 3 . #1#))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16678371

复制
相关文章

相似问题

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