vlisp 发表于 2022-7-5 16:46:48

将一个列表拆分为“一个”列表

大家好,
我想从列表中的任何成员中拆分一个列表,然后用beginnig元素接收一个列表。
示例:给定列表(1 5 3 6 8 2 10)
所选成员:3
结果:列表(3 6 8 2 10 1 5)
 
谢谢你

Grrr 发表于 2022-7-5 16:59:25

这可能会起作用:

(defun foo ( n Lst )
(append
   (vl-member-if '(lambda (x) (= n x)) Lst)
   (reverse (cdr (vl-member-if '(lambda (x) (= n x)) (reverse Lst))))
)
)
 

_$ (foo 3 '(1 5 3 6 8 2 10))
(3 6 8 2 10 1 5)
_$

vlisp 发表于 2022-7-5 17:03:46

谢谢你,Grrr!
它工作完美
 
 

David Bethel 发表于 2022-7-5 17:14:23

如果列表中的键原子(3)超过1个,会发生什么-大卫

Lee Mac 发表于 2022-7-5 17:22:28

另一个:
(defun foo ( n l )
   (repeat (cond ((vl-position n l)) (0)) (setq l (append (cdr l) (list (car l)))))
)或:
(defun bar ( n l / r )
   (append
       (vl-member-if '(lambda ( x ) (cond ((= n x)) ((setq r (cons x r)) nil))) l)
       (reverse r)
   )
)或:
(defun baz ( n l )
   (   (lambda ( foo ) (foo n l nil))
       (lambda ( n l a )
         (cond
               (   (null l) (reverse a))
               (   (= n (car l)) (append l (reverse a)))
               (   (foo n (cdr l) (cons (car l) a)))
         )
       )
   )
)

Grrr 发表于 2022-7-5 17:24:57

没问题,但我的建议(又懒又快)没有考虑重复的项目,事实上它有缺陷:

_$ (foo 3 '(3 1 5 3 6 8 2 10))
(3 1 5 3 6 8 2 10 3 1 5)

正如David提到的:
 
@李,
我很难理解你的代码(尤其是最后一个-1。这叫做递归lambda吗?2。这到底是怎么工作的?)

Lee Mac 发表于 2022-7-5 17:32:19

 
最后一个示例涉及将一个匿名lambda函数作为参数提供给另一个匿名lambda函数,这样,当对最外层的lambda函数进行求值时,在lambda参数内递归求值的符号成为一个定义的函数-最精细的模糊处理
 
当然,该函数也可以更明确地写成:
这里,参数“acc”是用每个递归调用填充的累加器-这称为尾部递归。

Grrr 发表于 2022-7-5 17:44:32

李,谢谢你的解释!
 
我认为AutoLISP中最大的障碍之一是递归。
希望有一天我能更好地理解他们。

Roy_043 发表于 2022-7-5 17:52:00

另一个:
8
页: [1]
查看完整版本: 将一个列表拆分为“一个”列表