如何解决如何修改函数内的列表
(defun list-parser (list count)
...);;this function reads items by count from list and do some process to them.
;;i.e.convert items read from code to char,or to other things and then return it.
;;Also,the items in list should be consumed,globally.
(defmethod foo ((obj objtype-2) data-list)
(setf (slot-1 obj) (read-list data-list 1))
obj)
(defmethod foo ((obj objtype-1) data-list)
(setf (slot-1 obj) (read-list data-list 1)
(print data-list)
(slot-2 obj) (read-list data-list 2)
(print data-list)
(slot-3 obj) (foo (make-instance 'objtype-2) data-list)
(print data-list)
(slot-4 obj) (read-list data-list 3))
obj)
如何让它像这样工作:(读取列表在某种程度上就像读取字节一样工作:
1.返回读取的值(并在此处解析)
2.改变流的位置(这里是列表)。
(let ((obj)
(data))
(setf data '(1 2 3 4 5 6 7 8)
obj (foo (make-instance 'objtype-1) data))
(print data))
>>(2 3 4 5 6 7 8)
>>(4 5 6 7 8)
>>(5 6 7 8)
>>(8)
或者更确切地说,您如何处理此类任务?您是否将列表转换为其他类型?
解决方法
我不太确定你在追求什么,但这里有一个函数,它创建一个“列表阅读器”对象(只是一个函数)。列表阅读器可以让你读取一个列表的大块,把它当作一个流来处理。
(defun make-list-reader (l)
;; Make a list reader which,when called,returns three values: a
;; chunk of list,the length of tha chunk (which may be less than
;; how much was asked for) and the remaining length. The chunk is
;; allowed to share with L
(let ((lt l)
(len (length l)))
(lambda (&optional (n 1))
(cond
((zerop len)
(values nil 0 0))
((< len n)
(values lt len 0))
(t
(let ((it (subseq lt 0 n)))
(setf lt (nthcdr n lt)
len (- len n))
(values it n len)))))))
(defun read-from-list-reader (r &optional (n 1))
;; Read from a list reader (see above for values)
(funcall r n))
现在:
(defvar *l* (make-list-reader '(1 2 3)))
*l*
> (read-from-list-reader *l* 1)
(1)
1
2
> (read-from-list-reader *l* 2)
(2 3)
2
0
> (read-from-list-reader *l* 10)
nil
0
0
你不能真正做的是编写一个函数(当然不是一个函数,因为它修改了它的参数)在修改它的参数列表时像这样工作。因此,您可以编写一个函数来执行此操作:
> (let ((l (list 1 2)))
(values (read-from-list l)
l))
(1)
(2)
它通过修改 car
的第一个 cons 的 cdr
和 l
来工作,正如您所期望的那样。但是当没有更多可阅读时,这是行不通的:l
是缺点而 nil
不是缺点,因此您永远无法使 l
{{1} } 带有一个函数。
但无论如何,这样的函数对于粗心的人来说只是一堆陷阱,而且通常很可怕:例如,您的示例将涉及修改文字,这是不合法的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。