乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 37|回复: 4

[编程交流] 从循环创建列表

[复制链接]

12

主题

44

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 13:10:32 | 显示全部楼层 |阅读模式
我有一个“foreach”循环在一个列表中运行,并想要一个返回值的列表。但我似乎无法解决这个问题,我也不知道为什么。
首先,在循环之前,我创建了一个列表,其中有一个元素将在以后删除(如果有人告诉我如何摆脱这个添加并摆脱它,我将不胜感激)
然后,我运行循环,将结果附加到列表中。
在循环之后,我用没有第一个元素的列表的副本替换列表。
 
这是一个类似的代码,有相同的问题。我可能做错了什么。。。
 
  1. (defun c:testaforeach()
  2.     (setq listappend (list 1 2 3 4 5));a list with elements to be appended
  3.     (setq list1 (list 0)); starts the list
  4.     (foreach e listappend
  5.         (append list1 (list e)); appends a list containig just that element to the started one
  6.         (print e)
  7.     )
  8.     (setq list1 (cdr list1)) ; get rid of the first element
  9. )

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

 
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 13:32:46 | 显示全部楼层
  1. (setq l '(0 1 2 3 4 5))
  2. (defun _cdr (l n)
  3.   (if (> n 0)(cons (nth (1- n) l) (_cdr l (1- n))))
  4.     )
  5. (_cdr (reverse l) (1-(length l)))
  6. ;(1 2 3 4 5)
  7. (_cdr (reverse l) 3 )
  8. ;(3 4 5)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

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

使用道具 举报

12

主题

44

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 14:24:25 | 显示全部楼层
 
通常,每次迭代都会使用cons函数构造一个列表,就像Lee Mac的演示一样。
虽然append可以在条件语句中使用,但为了将项追加到列表中或不模拟void(void!=null):
 
  1. 9

 
这不是优势,而是要求!看看这个。
 
 
看看这个。
 
 
你可以使用“喜欢”按钮,这是CAD用户的脸书! 
 
 
好的,从简单开始:
如果某件事没有像你预期的那样工作,或者你不了解它是如何工作的,那么在观察的基础上建立你的事实和知识。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 00:49 , Processed in 3.186914 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表