迭代以创建列表。
大家好!所以我对lisp还比较陌生,我对lisp中的列表只了解一点点,但我需要通过while循环创建一个列表。我的问题是,每次我想添加到列表时都使用相同的变量,这导致列表永远不会大于一。我猜这是指针问题,我想知道什么是变通方法。以下是一些示例代码:
(defun listcopy (list1)
(setq index1 0)
(setq listlength 10)
(setq newlist '())
(while (< index1 listlength)
(setq current (nth index1 list1))
(setq newcurrent (substr current 5))
(insertnth newcurrent index1 newlist)
(1+ index1)
);end while
);end function
(defun insertnth (element num list1)
(if (and list1 (< 0 num))
(cons (car list1) (insertnth element (1- num) (cdr list1)))
(cons element list1)
);end if
);end function
这是代码的简化版本:我实际上做的不仅仅是去掉字符串的前5个字母,但这是一个很好的例子。谢谢你的帮助! 尝试在“(insertnth…”之后添加以下代码
一个建议。更改( 很好,但是在看了我的“实际”代码之后,我已经在那里了,所以这不是问题所在-_- 这两个建议或只是(
....
(setq newlist (insertnth newcurrent index1 newlist))
(setq index1 (1+ index1))
...
正如pBe正确指出的那样,问题是因为没有将insertnth函数或1+函数的返回值赋给变量。
但是,您的任务可以使用以下工具执行:
(mapcar '(lambda ( x ) (substr x 5)) list1)
此外,请记住本地化变量。 此外,如果您仍然想使用命令循环(即,尚未理解李的函数),我建议只需使用cons添加到新列表的前面,然后在末尾执行相反的操作。这将比使用insertnth高效得多。例如。
或者从最后一项向下循环:。
5 谢谢大家!您的所有实现都运行良好。 很乐意帮忙。lisp(尤其是AutoLisp)需要记住的一点是,列表是作为链表实现的。因此,指向列表中间某个位置的索引需要时间才能到达,它必须从开始运行(或者,如果它是作为双链接列表实现的,则从列表的末尾运行),而不是在其他语言中使用数组。因此,最有效的方法是将您的程序设计为尝试忽略索引本身,即简单地遍历列表并修改每个项(正如Lee的代码所做的那样)。 啊,我明白了。不过,为了更好地解释我的情况,我需要列出一个清单,上面列出所有的。在目录中的dwg文件中,使用解析算法从文本字符串中提取整数,然后使用该整数决定是否将其包含在新的“理想”图形名称列表中。因此,我觉得也许更好的实现不是使用InsertNth插入到一个新列表中,而是使用一些函数removen,这样当我在列表中发现一个“不需要的”元素时,我可以删除它,从而避免在过程中创建一个新列表。
页:
[1]
2