函数vl排序问题
大家好。我对函数vl sort有问题
这是代码
(setq L (list "D1A" "D3" "D7" "D4" "D9" "D10B" "D10A" "D11" "D2" "D20A"))
(vl-sort L '<)
例子:
(defun ArchSort (lst / SplitStr comparable)
;; Gile & Lee Mac
(defun SplitStr (str / lst test rslt num tmp)
(setq lst(vl-string->list str)
test (chr (car lst)))
(if (< 47 (car lst) 58)
(setq num T))
(while (setq lst (cdr lst))
(if num
(cond ((= 46 (car lst))
(if (and (cadr lst)
(setq tmp (strcat "0." (chr (cadr lst))))
(numberp (read tmp)))
(setq rslt (cons (read test) rslt) test tmp lst (cdr lst))
(setq rslt (cons (read test) rslt) test "." num nil)))
((< 47 (car lst) 58)
(setq test (strcat test (chr (car lst)))))
(T (setq rslt (cons (read test) rslt) test (chr (car lst)) numnil)))
(if (< 47 (car lst) 58)
(setq rslt (cons test rslt) test (chr (car lst)) numT)
(setq test (strcat test (chr (car lst)))))))
(if num
(setq rslt (cons (read test) rslt))
(setq rslt (cons test rslt)))
(reverse rslt))
(defun comparable (e1 e2)
(or (and (numberp e1) (numberp e2))
(= 'STR (type e1) (type e2))
(not e1)
(not e2)))
(mapcar
(function
(lambda (x)
(nth x lst)))
(vl-sort-i (mapcar (function SplitStr) lst)
(function
(lambda (x1 x2 / n1 n2 comp)
(while
(and (setq comp (comparable (setq n1 (car x1))
(setq n2 (car x2))))
(= n1 n2))
(setq x1 (cdr x1) x2 (cdr x2)))
(if comp (< n1 n2) (numberp n1)))))))
(ArchSort (list "D1A" "D3" "D7" "D4" "D9" "D10B" "D10A" "D11" "D2" "D20A"))
>> ("D1A" "D2" "D3" "D4" "D7" "D9" "D10A" "D10B" "D11" "D20A")
太棒了!
谢谢Gile
谢谢李
非常感谢你 不客气 谢谢李
当我有列表L时,请告诉我如何使用函数ArchSort
(setq L(append(list(cons“D1A”2))(list(cons“D3”2))(list(cons“D7”3))(list(cons“D4”2))(list(cons“D9”1))(list(cons“D10B”1))(list(cons“D10A”3))(list(cons“D11”2))(list(cons“D2”4))(list(cons“D20A”2)))
((“D1A.2)(“D3.2”(“D7.3)(“D4.2”(“D9.1)(“D10B.1)(“D10A”)。
3) (“D11.2)(“D2.4”(“D20A.2))
请告诉我怎么解决
谢谢 更改突出显示。
顺便说一句,不需要所有的附加。。。
(defun ArchSort (lst / SplitStr comparable)
;; Gile & Lee Mac
(defun SplitStr (str / lst test rslt num tmp)
(setq lst(vl-string->list str)
test (chr (car lst)))
(if (< 47 (car lst) 58)
(setq num T))
(while (setq lst (cdr lst))
(if num
(cond ((= 46 (car lst))
(if (and (cadr lst)
(setq tmp (strcat "0." (chr (cadr lst))))
(numberp (read tmp)))
(setq rslt (cons (read test) rslt) test tmp lst (cdr lst))
(setq rslt (cons (read test) rslt) test "." num nil)))
((< 47 (car lst) 58)
(setq test (strcat test (chr (car lst)))))
(T (setq rslt (cons (read test) rslt) test (chr (car lst)) numnil)))
(if (< 47 (car lst) 58)
(setq rslt (cons test rslt) test (chr (car lst)) numT)
(setq test (strcat test (chr (car lst)))))))
(if num
(setq rslt (cons (read test) rslt))
(setq rslt (cons test rslt)))
(reverse rslt))
(defun comparable (e1 e2)
(or (and (numberp e1) (numberp e2))
(= 'STR (type e1) (type e2))
(not e1)
(not e2)))
(mapcar
(function
(lambda (x)
(nth x lst)))
(vl-sort-i (mapcar (function SplitStr) (mapcar (function car) lst))
(function
(lambda (x1 x2 / n1 n2 comp)
(while
(and (setq comp (comparable (setq n1 (car x1))
(setq n2 (car x2))))
(= n1 n2))
(setq x1 (cdr x1) x2 (cdr x2)))
(if comp (< n1 n2) (numberp n1)))))))
非常感谢李
但是我在列表L中遇到了一个问题。这个代码不起作用
(ArchSort(列表“D1-1”“D1-10”“D1-12”“D1-13”“D1-14”“D1-15A”“D1-15B”“D1-15C”“D1-1B”“D1-1C”“D1-1D”“D1-2”“D1-20”“D1-21”“D1-22”“D1-23”“D1-3A”“D1-3B”“D1-4A”“D1-4B”“D1-4C”“D1-5”“D1-6A”“D1-6B”“D1-7A”“D1-7B”“D1-8”“D1-9A”“D1-9B”“D1-9C”“D1-B”“D1-C”“D1-D”“DL-D“DL-E”))
>>>>不起作用。。。。。
我不明白为什么?
请告诉我怎么解决
谢谢 你能帮我查一下密码吗?
非常感谢你 试试这个:
5 代码对你有用吗? 太好了
谢谢你的帮助
代码运行得很好
谢谢
页:
[1]
2