列表的部分
这可能是一个愚蠢的问题,但我今天还没有完全清醒。如果我有一个清单,比如说
(a b c d e f)
我想说,
(c d e)
从中可以看出,如何在不经历大量cad、cadr、cdr、cddr等的情况下实现这一点是最好的方法。
我已经研究了nth,但这似乎只检索到一个成员。
谢谢
李 取决于你如何陈述问题
你想要第三个、第四个和第五个原子吗?
你想去掉前两个原子和最后一个原子吗?
你只想要c d e吗?
-大卫 李,还有一个办法:
(mapcar 'read
(mapcar 'chr
(vl-string->list
(substr
(apply 'strcat
(mapcar 'vl-princ-to-string '(a b c d e f))
) ;_ end_apply
3
3
) ;_ end_substr
) ;_ end_read
) ;_ end_list
) ;_ end_apply
*编辑*
结果更新(CDE)为(C D E) 另一个代码:
(defun Extract-List-Items(Lst Items / oLst)
(reverse
(foreach i Items
(setq oLst(cons(nth i Lst)oLst))
)
)
)
测试:
Command: (Extract-List-Items '(a b c d e f) '(1 2 3))
(B C D)
Command: (Extract-List-Items '(a b c d e f) '(0 5))
(A F)
Command: (Extract-List-Items '(a b c d e f) '(0 1 344))
(A B nil) 还有一点:
(defun Extract-List-Items(Lst Items)
(mapcar '(lambda(i)(nth i Lst))Items)
)
Command: (Extract-List-Items '(a b c d e f) '(0 4 5))
(A E F)
(defun GetSubList
(InList Strt Len /)
(if InList
(if (> Strt 0)
(GetSubList (cdr InList) (1- Strt) Len)
(if (> Len 0)
(cons (car InList) (GetSubList (cdr InList) 0 (1- Len)))
)
)
)
)
非常感谢各位的回复,一些非常巧妙的解决方案。
我会仔细阅读各种回复,看看哪一个最适合我的编码
谢谢大家
这里的ASMI编码很棒(和所有其他示例一样)…-喜欢这个简单
我想知道为什么LISP从来没有包含一个类似于“substr”的函数用于列表,这样就可以选择列表的一部分。。。 我认为我从来没有遇到过这样的情况,即我知道原子的位置以提取除点值以外的其他值。但这里有一个列表的准substr。请记住,它将(第n个)位置,而不是角色位置。
(defun sublst (l s n / tmp)
(repeat n (setq tmp (cons (nth s l) tmp))
(setq s (1+ s)))
(reverse tmp))
大卫
非常感谢您的贡献,大卫,非常直观的解决方案。
为了回答您为什么需要这样一个函数的问题:当将DCL与我的LISP一起使用时,我有一个主要的变量列表,我将其值添加到popup\u列表中。
然而,我有两个这样的popup_列表,填充第二个列表的值取决于用户从第一个列表中所做的选择。
因此,当用户选择第一个选项时,我需要获取主列表的一部分来填充第二个弹出列表。。。
当然,我本可以为每种选择组合写下新的列表,但这其中的乐趣何在。。。
再次感谢,,
李
页:
[1]
2