gschmidt 发表于 2022-7-5 19:55:50

如何通过编号重复

你好
 
我有3个列表(List1、List2和List3)填充了值
重复一次,我想从每个列表中获取第一个元素。
 
我试过这个:

(setq cnt 1)
(repeat 3
   (progn
      (nth 0 (strcat "List" (itoa cnt)))
      "do something"
   )
   (setq cnt (1+cnt)
)

 
但我犯了个错误
我做错了什么?

Tharwat 发表于 2022-7-5 20:03:13

除了你想要的结果之外,给我看看这三个列表的内容。

gschmidt 发表于 2022-7-5 20:09:25

它们表示excel工作表中的距离值。还有空值单元格(nil)
我忘了提到(如果不等于零)部分
 
列表1(660.0 400.0 580.0 480.0 410.0零零零零零零零零)
列表2(530.0 540.0 nil nil nil nil nil nil)
列表3(nil nil nil nil nil nil nil nil nil nil nil);;;;;情况并非总是如此!
 

(setq cnt 1)
(repeat 3
(if (/= (nth (strcat "List" (itoa cnt)) nil)
   (progn
      (nth 0 (strcat "List" (itoa cnt)))
      "do something"
   )
   (setq cnt (1+cnt)
)
)

Tharwat 发表于 2022-7-5 20:13:41

这一个与重复,因为你在寻找。
 
(setq List1 '(660.0 400.0 580.0 480.0 410.0 nil nil nil nil nil)
   List2 '(530.0 540.0 nil nil nil nil nil nil nil nil)
   List3 '(nil nil nil nil nil nil nil nil nil nil)
   )

(setq cnt 0)
(repeat 3
(if (setq v (car (eval (read (strcat "List" (itoa (setq cnt (1+ cnt))))))))
   (setq lst (cons v lst))
   )
)

gschmidt 发表于 2022-7-5 20:14:50

很有魅力!thanx人。。。

Tharwat 发表于 2022-7-5 20:19:57

 
不客气

Lee Mac 发表于 2022-7-5 20:25:57

如果我理解了你想要实现的目标,这会有帮助吗?
(setq List1 '(660.0 400.0 580.0 480.0 410.0 nil nil nil nil nil)
   List2 '(530.0 540.0 nil nil nil nil nil nil nil nil)
   List3 '(nil nil nil nil nil nil nil nil nil nil)
)
(mapcar 'list list1 list2 list3)
=> ((660.0 530.0 nil) (400.0 540.0 nil) (580.0 nil nil) (480.0 nil nil) (410.0 nil nil) (nil nil nil) (nil nil nil) (nil nil nil) (nil nil nil) (nil nil nil))

BIGAL 发表于 2022-7-5 20:31:25

您也可以使用(第n个x列表)获取列表中的任何项目。显然,如果x大于项目数,则会出现错误。当您想要操作多个列表时,它非常方便。

pBe 发表于 2022-7-5 20:33:55

我知道你的问题是关于重复功能的,可能是因为你的列表目前是如何设置的。
 
如果您试图从数量不确定的源创建数据存储。我建议只使用一个变量和多个列表(正如Bigal建议的那样),并避免使用nil值作为元素。
 
所以不是这个
 

(setq List1 '(660.0 400.0 580.0 480.0 410.0 nil nil nil nil nil)
   List2 '(530.0 540.0 nil nil nil nil nil nil nil nil)
   List3 '(nil nil nil nil nil nil nil nil nil nil)
   )
 
(setq Lists '((660.0 400.0 580.0 480.0 410.0 0.0 0.0 0.0 0.0 0.0)
             (530.0 540.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)
             (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)))
 
每个列表的元素数是已知的:Excel列/行,因此当您调用下面的sub_函数时,不会有跳过每个列表的元素数的危险。
 
(defun _nth (n l) (mapcar '(lambda (x)(nth n x)) l))
 
假设您需要每个列表中的第4项
 
(_nth 3 lists)
(480.0 0.0 0.0)
 
每个列表的第一项
(_nth 0 lists)
(660.0 530.0 0.0)
 
(defun c:demo( / Lists op order propertydata)
   
;;   this is the section where you retreive the excel data from excel file        ;;

; And this is the result ;
   (setq Lists '((660.0 400.0 580.0 480.0 410.0 0.0 0.0 0.0 0.0 0.0)
             (530.0 540.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)
             (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)
             ))
   
   (initget 1 "D W V")
   (setq op (getkword "\nChoose properties : "))
   (setq order (cadr (assoc op '(("D" 0)("W" 1)("V" 2)))))
   (print (setq propertydata (_nth order Lists)))
   
; example of getting the sum of the data property
   
   (print (apply '+ propertydata))
   (princ)
   )
 
Command:DEMO
Choose properties [Distance/Width/Volume]: D
(660.0 530.0 0.0)
1190.0

 
HTH公司

gschmidt 发表于 2022-7-5 20:38:55

很抱歉我的回复太晚,但我的问题只通过Tharwats代码的一部分得到了解决。
我必须画10条线,每条线上最多画3个圆。
这些值在excel表格中:
 
col1=名称
col2=x
col3=y
col4=圆圈1(可以为空)
col5=圆圈2(可以为空)
col6=圆圈3(可以为空)
 
(我有更多的列,但这里没有提及)
 
因为我有10行,excel中有10行。
使用我在互联网上找到的代码,我导入Excelsheet的每一列并将其放入列表中。
 
我在重复中使用了col1(list0)的值的长度,并使用一个计数器来ENTMAKE行List1(col2)和List2(col3)。然而,圆(List3、List4和List5)的ENTMAKE需要在第二个repeat和一个计数器中,因为它们属于一行。
 
当我使用:(nth cnt1(strcat“List”(itoa cnt2))时,它给出了一个错误。
但是当我使用:(nth cnt1(eval(read(strcat“List”(itoa cnt2 а)а)]))时,它工作了
页: [1] 2
查看完整版本: 如何通过编号重复