linyangmjtd 发表于 2020-12-11 14:47:09

怎么将多级表用函数按先后顺序转为一级表

有谁知道怎么将表'(1 2 (3 4 (5 "6")))变成表'(1 2 3 4 5 "6")

xvjiex 发表于 2020-12-11 14:47:10

(defun onelst (lst1 / lst)
(foreach a lst1
    (if (listp a)
      (setq lst(append (onelst a) lst))
      (setq lst(cons a lst))
    )
)
)
(princ(reverse (onelst '(1 2 (3 4 (5 "6"))))))

linyangmjtd 发表于 2020-12-11 18:07:50

xvjiex 发表于 2020-12-11 14:47
(defun onelst (lst1 / lst)
(foreach a lst1
    (if (listp a)


感谢!我研究下

wzg356 发表于 2020-12-11 19:12:58

本帖最后由 wzg356 于 2020-12-11 19:15 编辑

沙发可改为

(defun onelst1 (lst1 / lst)
(foreach a lst1
    (if (listp a)
      (setq lst(append lst (onelst a)))
      (setq lst(append lst(list a)))
    )
)
)
;(onelst1 '(1 2 (3 4 (5 "6"))))

xvjiex 发表于 2020-12-11 20:19:33

wzg356 发表于 2020-12-11 19:12
沙发可改为

(defun onelst1 (lst1 / lst)


append比较容易理解和使用,就是速度慢,尽量使用 cons。

linyangmjtd 发表于 2020-12-11 20:46:59

wzg356 发表于 2020-12-11 19:12
沙发可改为

(defun onelst1 (lst1 / lst)


好的,数据处理不多用APPEND好点,数据多用cons

linyangmjtd 发表于 2020-12-11 20:47:39

xvjiex 发表于 2020-12-11 20:19
append比较容易理解和使用,就是速度慢,尽量使用 cons。

嗯呢 是的,我改为了APPEND

wzg356 发表于 2020-12-11 21:09:25

没关系啊,也可把沙发合并成一个函数,结果更直观,直接是要的结果

crtrccrt 发表于 2020-12-13 06:48:13

(listp a)

改为

(and a (listp a))

测试

(onelst '(1 2 nil (3 4 (5 "6"))))

正确返回

(1 2 nil 3 4 5 "6")


页: [1]
查看完整版本: 怎么将多级表用函数按先后顺序转为一级表