微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修改函数内的列表

如何解决如何修改函数内的列表

(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 的 cdrl 来工作,正如您所期望的那样。但是当没有更多可阅读时,这是行不通的:l 是缺点而 nil 不是缺点,因此您永远无法使 l {{1} } 带有一个函数。

但无论如何,这样的函数对于粗心的人来说只是一堆陷阱,而且通常很可怕:例如,您的示例将涉及修改文字,这是不合法的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。