乐筑天下

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

[编程交流] 迭代以创建列表。

[复制链接]

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 07:09:31 | 显示全部楼层 |阅读模式
大家好!
 
所以我对lisp还比较陌生,我对lisp中的列表只了解一点点,但我需要通过while循环创建一个列表。我的问题是,每次我想添加到列表时都使用相同的变量,这导致列表永远不会大于一。我猜这是指针问题,我想知道什么是变通方法。以下是一些示例代码:
 
  1. (defun listcopy (list1)
  2.    (setq index1 0)
  3.    (setq listlength 10)
  4.    (setq newlist '())
  5.    (while (< index1 listlength)
  6.        (setq current (nth index1 list1))
  7.        (setq newcurrent (substr current 5))
  8.        (insertnth newcurrent index1 newlist)
  9.        (1+ index1)
  10.    );end while
  11. );end function
  12. (defun insertnth (element num list1)
  13.    (if (and list1 (< 0 num))
  14.        (cons (car list1) (insertnth element (1- num) (cdr list1)))
  15.        (cons element list1)
  16.    );end if
  17. );end function

 
这是代码的简化版本:我实际上做的不仅仅是去掉字符串的前5个字母,但这是一个很好的例子。谢谢你的帮助!
回复

使用道具 举报

0

主题

19

帖子

15

银币

初来乍到

Rank: 1

铜币
6
发表于 2022-7-6 07:18:24 | 显示全部楼层
尝试在“(insertnth…”之后添加以下代码
 
一个建议。更改(
回复

使用道具 举报

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 07:24:45 | 显示全部楼层
很好,但是在看了我的“实际”代码之后,我已经在那里了,所以这不是问题所在-_-
回复

使用道具 举报

0

主题

19

帖子

15

银币

初来乍到

Rank: 1

铜币
6
发表于 2022-7-6 07:31:20 | 显示全部楼层
这两个建议或只是(
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 07:37:13 | 显示全部楼层
  1. ....
  2. [b](setq newlist [/b](insertnth newcurrent index1 newlist)[b])[/b]
  3. [b](setq index1[/b] (1+ index1)[b])[/b]
  4. ...
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:44:06 | 显示全部楼层
正如pBe正确指出的那样,问题是因为没有将insertnth函数或1+函数的返回值赋给变量。
 
但是,您的任务可以使用以下工具执行:
 
  1. (mapcar '(lambda ( x ) (substr x 5)) list1)

 
此外,请记住本地化变量。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 07:47:17 | 显示全部楼层
此外,如果您仍然想使用命令循环(即,尚未理解李的函数),我建议只需使用cons添加到新列表的前面,然后在末尾执行相反的操作。这将比使用insertnth高效得多。例如。
或者从最后一项向下循环:。
  1. 5
回复

使用道具 举报

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 07:57:04 | 显示全部楼层
谢谢大家!您的所有实现都运行良好。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 08:01:31 | 显示全部楼层
很乐意帮忙。lisp(尤其是AutoLisp)需要记住的一点是,列表是作为链表实现的。因此,指向列表中间某个位置的索引需要时间才能到达,它必须从开始运行(或者,如果它是作为双链接列表实现的,则从列表的末尾运行),而不是在其他语言中使用数组。因此,最有效的方法是将您的程序设计为尝试忽略索引本身,即简单地遍历列表并修改每个项(正如Lee的代码所做的那样)。
回复

使用道具 举报

4

主题

13

帖子

9

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 08:07:00 | 显示全部楼层
啊,我明白了。不过,为了更好地解释我的情况,我需要列出一个清单,上面列出所有的。在目录中的dwg文件中,使用解析算法从文本字符串中提取整数,然后使用该整数决定是否将其包含在新的“理想”图形名称列表中。因此,我觉得也许更好的实现不是使用InsertNth插入到一个新列表中,而是使用一些函数removen,这样当我在列表中发现一个“不需要的”元素时,我可以删除它,从而避免在过程中创建一个新列表。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 15:08 , Processed in 0.353302 second(s), 72 queries .

© 2020-2025 乐筑天下

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