本帖最后由 vitalgg 于 2023-4-24 09:28 编辑
用法:
- (list:group-by lst 'fun)
示例:
比如一组整数 lst = ( 1 3 5 1 4 5 3 8 2)
(setq lst '(1 3 5 1 4 5 3 8 2))
因为内部有相同的元素,我们无法使用 vl-sort 排序。所以使用 list:sort 进行无损排序
(setq lst (list:sort lst '<))
然后把相同的元素进行分组
(setq res (list:group-by lst '=))
比较函数 fun 的说明示例。
对于一个图元表 lst, 内容为 (ent1 ent2 ent3 ent4 ....entn)
如果我们要对它按特定特征分组。需要分两步进行。
1、按特征进行排序,比如 都是 单行文本 text 按 内容排序。
(setq lst (vl-sort lst '(lambda(x y) (< (entity:getdxf x 1)(entity:getdxf y 1)))))
2、按特征分组,fun 的意思是特征相同返回真,则分为一组。
(setq lst (list:group-by lst '(lambda(x y) (= (entity:getdxf x 1)(entity:getdxf y 1)))))
- (defun list:group-by (lst fun / res g)
- "对已排序的列表lst进行分组。fun为分组依据"
- "lst"
- "(list:group-by '(a a a b b c)
- '(lambda(x y)(= x y)))
- => ((a a a)(b b)(c))"
- (setq res nil)
- (setq g (cons (car lst)
- nil))
- (while (setq lst (cdr lst))
- (setq a% (car lst))
- (if ((eval fun)
- (car g)
- a%)
- (setq g (cons a% g))
- (progn (setq res (cons (reverse g)
- res))
- (setq g (cons a% nil)))))
- (if g (setq res (cons (reverse g)
- res)))
- (reverse res))
无须复制,在CAD内 安装 @lisp ,可以直接调用这个函数。
将以下代码复制到 CAD 命令行内,回车即可开始安装。
(在代码行里用鼠标连续三击全选,然后右键复制或Ctrl+C 。到CAD命令行内,右键粘贴或Ctrl+V)
- (progn(vl-load-com)(setq s strcat h "http" o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://atlisp.""org/@"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))
关注 公众号,快速查看 @lisp 函数用法
|