当前位置:  开发笔记 > 开发工具 > 正文

在Lisp中列出操作

如何解决《在Lisp中列出操作》经验,为你挑选了3个好方法。

我一直在寻找Lisp中的以下功能,并且无处可寻:

    找到列表中某些内容的索引.例:

    (index-of item InThisList)
    

    替换列表中特定位置的内容.例:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'?
    

    返回特定索引处的项目.例:

    (return InThisList ItemAtThisIndex)
    

到目前为止,我一直在用自己的功能伪装它.我想知道我是否只为自己创造更多的工作.

这就是我伪造1号的方式:

(defun my-index (findMe mylist)
  (let ((counter 0) (found 1))
    (dolist (item mylist)
      (cond
        ((eq item findMe) ;this works because 'eq' checks place in memory, 
                  ;and as long as 'findMe' was from the original list, this will work.
         (setq found nil)
        (found (incf counter))))
  counter))

小智.. 23

您可以使用setfnth按索引替换和检索值.

(let ((myList '(1 2 3 4 5 6)))
     (setf (nth 4 myList) 101); <----
     myList)

(1 2 3 4 101 6)

要通过索引查找,您可以使用该position功能.

(let ((myList '(1 2 3 4 5 6)))
     (setf (nth 4 myList) 101)
     (list myList (position 101 myList)))

((1 2 3 4 101 6) 4)

我在这个函数索引中找到了所有这些.



1> 小智..:

您可以使用setfnth按索引替换和检索值.

(let ((myList '(1 2 3 4 5 6)))
     (setf (nth 4 myList) 101); <----
     myList)

(1 2 3 4 101 6)

要通过索引查找,您可以使用该position功能.

(let ((myList '(1 2 3 4 5 6)))
     (setf (nth 4 myList) 101)
     (list myList (position 101 myList)))

((1 2 3 4 101 6) 4)

我在这个函数索引中找到了所有这些.



2> Sébastien Ro..:

    找到列表中某些内容的索引.

在Emacs Lisp和Common Lisp中,您有以下position功能:

> (setq numbers (list 1 2 3 4))
(1 2 3 4)
> (position 3 numbers)
2

在Scheme中,这是DrScheme的doc中的尾递归实现:

(define list-position 
  (lambda (o l)
    (let loop ((i 0) (l l))
      (if (null? l) #f
          (if (eqv? (car l) o) i
              (loop (+ i 1) (cdr l)))))))

----------------------------------------------------

> (define numbers (list 1 2 3 4))
> (list-position 3 numbers)
2
> 

但是如果你使用列表作为存储结构化数据的插槽集合,也许你应该看看defstruct甚至某种像CLOS这样的Lisp对象系统.

如果你正在学习Lisp,请确保你看看Practical Common Lisp和/或The Little Schemer.

干杯!



3> Eric Normand..:

回答:

    (位置项序列和键从头(开始0)结束键测试 - 不)
    http://lispdoc.com/?q=position&search=Basic+search

    (setf(elt序列索引)值)

    (elt序列索引)
    http://lispdoc.com/?q=elt&search=Basic+search
    注意:elt优于nth,因为elt适用于任何序列,而不仅仅是列表

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有