我正在使用一个基于CL的音乐创作可视化编程环境。我试图创建一个函数,当给定3个元素(12,3)时,它将返回1、2、3、1、2、3等,每次计算时都返回一个数字。书Common是一个Gentle简介,简要地提到可以使用锐利相等的符号创建循环列表,但没有详细介绍如何使用它们。请记住,我可以使用专门为此设计的对象在程序中插入实际的Lisp代码。
发布于 2013-05-22 07:38:30
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#)示例:
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此外:
CL-USER 6 > '#1=(1 2 3 . #1#)
#1=(1 2 3 . #1#)加上一点克洛斯:
(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发布于 2013-05-21 21:25:39
在尖头等号表示法中,它被写成#0=(1 2 3 . #0#)。
下面是一个函数,它根据给定的参数创建这样一个列表:
(defun circular (first &rest rest)
(let ((items (cons first rest)))
(setf (cdr (last items)) items)))然后,调用(circular 1 2 3)将返回您想要的循环列表。只需使用car和cdr来无限地迭代元素。
如果您真的想要一个迭代器函数,它不需要参数,并且返回每个调用的下一个项,那么下面是您可以这样做的方法:
(defun make-iter (list)
(lambda ()
(pop list)))发布于 2022-04-24 14:38:20
首先,您希望让打印机知道如何识别循环列表,而不是尝试打印整个列表:
(setf *print-circle* t)接下来,您可以使用尖头等号符号创建一个循环列表:
(setq x '#1=(1 2 3 . #1#))https://stackoverflow.com/questions/16678371
复制相似问题