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
希望这对您有所帮助
我在 运行 一段代码之后得到以下输出(一对单独的两个列表):
("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
希望这对您有所帮助