列表总和问题
我有一个“while”循环,每次循环时将在命令行中输入的内容添加到列表中。然后我想得到列表中所有数字的总和。我很有信心这会奏效:(setq CLength1 (apply '+ (list lst)))
但我在命令行上发现了这个错误:
; error: bad argument type: numberp: (36 36 36 36)
完整的“while”代码:
(while
(progn
(initget "U")
(setq d (getdist (strcat "\Distance to next Vert Strap (Enter when done; U to Undo)"))))
(setq lst (cons (fix d) lst))
(cond
((= d "U") (command "._undo" "._back"))
((/= d 0)
(progn
(command "._offset"
(/ d 12.)
s
"_non"
(polar (cdr (assoc 10 (entget s))) 0. 1.)
""
)
(if (not (eq s (setq s (entlast))))
(progn
(setq p1 (cdr (assoc 10 (entget s)))
p2 (cdr (assoc 11 (entget s)))
pt (if (< (cadr p1) (cadr p2))
p1
p2
)
)
(setq dx1 (car p1) ;ent x value
dx2 (cadr p1);ent y value
dx3 (caddr p1) ;ent z value
dd1 (+ dx1 (/ d 12)) ;dimension distance
sdx (- dx1 (/ d 12));start point x
dmx (/ (+ dd1 dx1) 2) ;middle
)
(if (>= d 18)
(setq doff -1.6)
(setq doff -3.2)
)
(entmake (list (cons 0 "DIMENSION")
(cons 100"AcDbEntity")
(cons 67 0)
(cons 8"DIMBAD")
(cons 100"AcDbDimension")
(cons 10 (trans (list dd1 doff 0.) 1 0))
(cons 11 (trans (list dmx doff 0.) 1 0))
(cons 12 (list 0. 0. 0.))
(cons 7033)
(cons 1"")
(cons 715)
(cons 721)
(cons 411.0)
(cons 52 0)
(cons 53 0)
(cons 540)
(cons 3"TEMPLATE_DRAWING")
(cons 100"AcDbAlignedDimension")
(cons 13 (trans (list sdx 0. 0.) 1 0))
(cons 14 (trans (list dx1 0. 0.) 1 0))
(cons 15 (list 0. 0. 0.))
(cons 16 (list 0. 0. 0.))
))
)
)
)
)))
(setq CLength1 (apply '+ (list lst)))
(princ CLength1)
试试看
(setq CLength1 (apply '+ lst))
完整代码:
(while
(progn
(initget "U")
(setq d
(getdist
(strcat
"\Distance to next Vert Strap (Enter when done; U to Undo)"
)
)
)
)
(setq lst (cons (fix d) lst))
(cond
((= d "U") (command "._undo" "._back"))
((/= d 0)
(progn
(command "._offset"
(/ d 12.)
s
"_non"
(polar (cdr (assoc 10 (entget s))) 0. 1.)
""
)
(if (not (eq s (setq s (entlast))))
(progn
(setq p1 (cdr (assoc 10 (entget s)))
p2 (cdr (assoc 11 (entget s)))
pt (if (< (cadr p1) (cadr p2))
p1
p2
)
)
(setq dx1 (car p1) ;ent x value
dx2 (cadr p1) ;ent y value
dx3 (caddr p1) ;ent z value
dd1 (+ dx1 (/ d 12)) ;dimension distance
sdx (- dx1 (/ d 12)) ;start point x
dmx (/ (+ dd1 dx1) 2) ;middle
)
(if (>= d 18)
(setq doff -1.6)
(setq doff -3.2)
)
(entmake (list (cons 0 "DIMENSION")
(cons 100 "AcDbEntity")
(cons 67 0)
(cons 8 "DIMBAD")
(cons 100 "AcDbDimension")
(cons 10 (trans (list dd1 doff 0.) 1 0))
(cons 11 (trans (list dmx doff 0.) 1 0))
(cons 12 (list 0. 0. 0.))
(cons 70 33)
(cons 1 "")
(cons 71 5)
(cons 72 1)
(cons 41 1.0)
(cons 52 0)
(cons 53 0)
(cons 54 0)
(cons 3 "TEMPLATE_DRAWING")
(cons 100 "AcDbAlignedDimension")
(cons 13 (trans (list sdx 0. 0.) 1 0))
(cons 14 (trans (list dx1 0. 0.) 1 0))
(cons 15 (list 0. 0. 0.))
(cons 16 (list 0. 0. 0.))
)
)
)
)
)
)
)
)
(setq CLength1 (apply '+ lst))
(princ (rtos lst 2 0)) ; Add precision here
是的,就是这样!每个例子都说把列表称为(list lst),不知道为什么。但无论如何谢谢你 当您在此时添加(setq lst(cons(fix d)lst))时,您已经将lst变量定义为list,然后无需再次添加(list lst)。 您可以直接执行求和,而不是构建列表,例如替换:
(setq lst (cons (fix d) lst))
使用:
(setq CLength1 (+ (cond (CLength1) (0)) (fix d)))
我的想法完全正确。
页:
[1]