Lisp-如何打破“一对”列表?

时间:2018-06-20 23:21:57

标签: lisp autocad autolisp

运行一段代码后,我得到以下输出(两个列表的单独对):

("a") ("a")

如何将这对列表合并为一个? 即我想要以下输出:

("a" "a")

为澄清起见,我的代码是:

(defun c:TEST ()
    (setq a (ssget)); I select a line here
    (setq b (assoc 8 (entget (ssname a 0)))); gets me all dotted pairs containing 8
    (setq c (list (cdr b))); gets second elements of each pair (strings in this case) and converts them to two separate lists
    (print c)
)

1 个答案:

答案 0 :(得分:2)

我已经解决了您的问题,据我所知,我正在尝试解决您的问题,看来您尝试获取该行的图层名称。

如果您以有问题的方式运行测试函数,则它会返回("a") ("a")两次,因为第一个是由于代码中的(print c)而第二个是函数输出值。输出是单个列表("a"),但它在命令提示符下写入了两次。

我以为您在这里误解了。如果在函数末尾键入(princ),则输出为("a")

请记住,AutoLISP始终将函数的最后一个语句作为函数值返回以获取更多信息通过开发人员文档。

此外,您还可以在AutoLISP中找到要开发价值的开发人员,请使用“打印”,“ princ”,“ prin1”和“提示”命令获取详细信息click here

下面我写一些函数可以帮助您更好地理解概念

;
(defun c:TEST()
    (setq a (ssget))
    (setq b (assoc 8 (entget (ssname a 0))))
    (setq c (list (cdr b)))
    (print c)
  ;output-> ("a") ("a")
)

(defun c:TEST1 ()
    (setq a (ssget))
    (setq b (assoc 8 (entget (ssname a 0))))
    (setq c (list (cdr b)))
    (print c)

  (princ);return nothing

  ;output-> ("a")
)


(defun c:TEST2()
    (setq a (ssget))
    (setq b (assoc 8 (entget (ssname a 0))))
    (setq c (list (cdr b)))
    (print c)

  (princ "last statement");return nothing
  ;output-> ("a") last statement"last statement"
  )

(defun c:TEST3()
    (setq a (ssget))
    (setq b (assoc 8 (entget (ssname a 0))))
    (setq c (list (cdr b)))
    (print c)

  (princ "last statement");return nothing
  (princ)
  ;output-> ("a") last statement
  )

如果您运行测试,则输出为("a") ("a")

如果运行test1,则输出为("a")

如果运行test2,则输出为("a") last statement"last statement"

在这里,您看到“ last statement”是两次,因为同样的原因,AutoLISP总是将函数的最后一个语句返回为函数值

如果运行test3,输出为("a") last statement

希望这会有所帮助