【问题标题】:Lisp - how to break a 'pair' of lists?Lisp - 如何打破“一对”列表?
【发布时间】:2018-06-20 23:21:57
【问题描述】:

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

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

【问题讨论】:

  • 使用APPEND 将多个列表追加到一个列表中。
  • 函数如何返回多个列表?
  • 你确定第一个("a") 不是打印出来的(c),第二个和返回值一样吗?
  • 我在这里和@Sylvester 在一起;单个 (print c) 不会产生两个值。 printf 函数 returns the leftmost argument value is it passed 等如果它是函数的最后一个表达式,则该函数将返回打印的任何内容。如果您从某个交互式侦听器(“REPL”或“read-eval 打印循环”)运行该函数,您将看到打印的输出和再次打印的返回值。
  • 我很笨。你是对的。我觉得我好笨。谢谢!如何标记为已解决?

标签: lisp autocad autolisp


【解决方案1】:

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

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

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

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

另外,您可以在 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"

在这里你看到“最后一条语句”是两次,因为同样的原因 AutoLISP 总是返回函数的最后一条语句作为函数值

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多