saim 发表于 2022-7-5 13:10:32

从循环创建列表

我有一个“foreach”循环在一个列表中运行,并想要一个返回值的列表。但我似乎无法解决这个问题,我也不知道为什么。
首先,在循环之前,我创建了一个列表,其中有一个元素将在以后删除(如果有人告诉我如何摆脱这个添加并摆脱它,我将不胜感激)
然后,我运行循环,将结果附加到列表中。
在循环之后,我用没有第一个元素的列表的副本替换列表。
 
这是一个类似的代码,有相同的问题。我可能做错了什么。。。
 

(defun c:testaforeach()
    (setq listappend (list 1 2 3 4 5));a list with elements to be appended
    (setq list1 (list 0)); starts the list
    (foreach e listappend
        (append list1 (list e)); appends a list containig just that element to the started one
        (print e)
    )
    (setq list1 (cdr list1)) ; get rid of the first element
)
我得到的是一个零值。print命令会全部打印,但列表仍然为空
为什么“list1”不以“listappend”开始结束?
如果必要的话,我可以展示所有真实的代码,但我相信问题的核心是这里使用的语法。
 
编辑:已解决。这是语法。很抱歉在(有没有办法删除这个主题?)之后,我自己发了帖子并弄清楚了。。。
这是固定代码

(defun c:testaforeach()
    (setq listappend (list 1 2 3 4 5));a list with elements to be appended
    (setq list1 (list 0)); starts the list
    (foreach e listappend
        (setq list1 (append list1 (list e))); appends a list containig just that element to the started one
        (print e)
    )
    (setq list1 (cdr list1)) ; get rid of the first element
)
 

hanhphuc 发表于 2022-7-5 13:32:46



(setq l '(0 1 2 3 4 5))

(defun _cdr (l n)
(if (> n 0)(cons (nth (1- n) l) (_cdr l (1- n))))
    )

(_cdr (reverse l) (1-(length l)))
;(1 2 3 4 5)

(_cdr (reverse l) 3 )
;(3 4 5)

Lee Mac 发表于 2022-7-5 13:48:24

值得注意的是,您不需要“启动列表”,因为nil相当于AutoLISP中的空列表,未绑定符号的计算结果类似于nil,因此是空列表。
 
因此,您的代码可以写成:
在Visual LISP IDE控制台上测试上述内容会产生以下结果:
务必在defun表达式中声明局部变量,否则这些变量将被视为全局变量,并将其值保留在文档命名空间内(即在活动图形的范围内)-请注意:
请注意,列表内容是如何在每次求值时重复的(以及由cdr表达式删除的不正确值),因为mynewlist变量在函数完成求值后保留了其值?有关此概念的更多信息,请参阅我的本地化变量教程。
 
我还建议使用AutoLISP cons函数,因为它比append函数更简洁、更高效:
在这种情况下,由于元素被“推”到列表的前面,因此列表是反向构造的,并且在函数的末尾使用反向函数。
 

saim 发表于 2022-7-5 14:03:36

谢谢你的提示!
我不知道“cons”命令。在某些情况下,它确实比“append”更好。谢谢你们!
“cons”代表什么?知道它将帮助我记住命令。
 
我知道声明变量的优点。我只需要在调试期间使它们全局化,以检查结果值-我经常犯错误,检查结果有助于找出做错了什么。但你是对的,我遇到了与你给出的示例类似的问题,并将其修复为将变量声明为局部变量,非常感谢你
 
现在,关于“开始列表”的事情。。。我看到AutoLisp占用了一个空白,说“这是一个空列表”,并向其中添加了元素。不。。。向右倾斜。可能是因为我无法翻译你使用的“未绑定符号”表达。你能解释一下这是什么意思吗?

Grrr 发表于 2022-7-5 14:24:25

 
通常,每次迭代都会使用cons函数构造一个列表,就像Lee Mac的演示一样。
虽然append可以在条件语句中使用,但为了将项追加到列表中或不模拟void(void!=null):
 
9
 
这不是优势,而是要求!看看这个。
 
 
看看这个。
 
 
你可以使用“喜欢”按钮,这是CAD用户的脸书! 
 
 
好的,从简单开始:
如果某件事没有像你预期的那样工作,或者你不了解它是如何工作的,那么在观察的基础上建立你的事实和知识。
页: [1]
查看完整版本: 从循环创建列表