Lisp - 如何打破 'pair' 个列表?

Lisp - how to break a 'pair' of lists?

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

("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)
)

我已经解决了你的问题,据我所知,我正在尝试解决你的问题,你似乎试图获取那条线的图层名称。

如果您 运行 测试所提到的函数,它会 return s ("a") ("a") 两次,因为第一个是由于代码中的 (print c) 而第二个是函数输出值。输出是单个列表 ("a") 但它在命令提示符下写了两次。

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

请记住 AutoLISP 始终 return 函数的最后一个语句作为功能值以获得更多通过开发人员文档。

此外,您可以在 AutoLISP 中找到打印值开发人员使用 "print"、"princ"、"prin1" 和 "prompt" 命令的详细信息 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 总是 return 函数的最后一个语句作为函数值

如果你 运行 test3 输出是 ("a") last statement

希望这对您有所帮助