将一个列表拆分为“一个”列表
大家好,我想从列表中的任何成员中拆分一个列表,然后用beginnig元素接收一个列表。
示例:给定列表(1 5 3 6 8 2 10)
所选成员:3
结果:列表(3 6 8 2 10 1 5)
谢谢你 这可能会起作用:
(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)
_$ 谢谢你,Grrr!
它工作完美
如果列表中的键原子(3)超过1个,会发生什么-大卫 另一个:
(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)))
)
)
)
) 没问题,但我的建议(又懒又快)没有考虑重复的项目,事实上它有缺陷:
_$ (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。这到底是怎么工作的?)
最后一个示例涉及将一个匿名lambda函数作为参数提供给另一个匿名lambda函数,这样,当对最外层的lambda函数进行求值时,在lambda参数内递归求值的符号成为一个定义的函数-最精细的模糊处理
当然,该函数也可以更明确地写成:
这里,参数“acc”是用每个递归调用填充的累加器-这称为尾部递归。 李,谢谢你的解释!
我认为AutoLISP中最大的障碍之一是递归。
希望有一天我能更好地理解他们。 另一个:
8
页:
[1]