【发布时间】:2015-01-13 17:05:28
【问题描述】:
我是 LISP 的初学者,希望你能为我解决我的困惑。我的代码如下:
(defun retrieve (element closed)
(if (= (length closed) 0)
(setf closedlist '(a))
(dolist (count closed)
(when (equal element (car count))
(progn (check (childvalue (symbol-value count)) count)
(return)));;;endif
);;;endouterloop
)
)
这是第一个函数,它将接收一个名为“元素”的对象和一个名为“关闭”的列表。下一个函数如下:
(defun check (child close)
(setf tempvalue child)
(dotimes (count (length tempvalue));;;1st loop
(setf front (car tempvalue))
(setf templist close)
(dotimes (count1 (length close));;;2nd loop
(if (= (length close) 1)
(if (string= front (car templist))
((remove (nth count) child) (return));;;true
(setf templist (car templist));;;else
)
(if (string= front (car templist))
(setf child (remove (nth count child) child))
(setf templist (cdr templist));;;else
)
)
);;;2nd loop
(setf tempvalue (cdr tempvalue))
);;;1stloop
(format t "child ~S~%" child)
)
我的问题是,从第一个函数开始,当我在第一个函数中并且满足条件时,我将调用第二个函数(检查)。但是,在我从第一个函数(检索)调用第二个函数(检查)并成功执行操作后,我想从第一个函数退出 dotimes 循环,但我做不到。
如果我尝试向它添加(返回),程序将退出循环,而不会在语句中执行其他操作。在这种情况下,(check (childvalue (symbol-value temp)) (nth count closed))。
有人可以就调用辅助函数后如何退出循环提供任何建议吗?谢谢。
【问题讨论】:
-
这是非常糟糕的代码:未格式化的代码、大量未声明的变量、通过循环中的 NTH 访问列表元素、函数 CHECK 中的几个错误、重复计算列表的长度......你应该扔掉代码并重新开始。使用 Lisp 编译器——它会给你很多错误和警告。
-
@RainerJoswig 对不起,我在这方面很初学者。你介意给我一个关于“未声明变量”的例子吗?除了通过循环中的 NTH 之外,还有没有更好的方法来访问列表元素?
-
@Piiinkyy 现在不用担心,你会学会的。不过,您现在有点在 lisp 的语法中键入 C 风格..
-
@RainerJoswig Piiinkyy 显然是 stackoverflow 上的新手和 lisp 中的新手,对于双初学者来说,他发布了非常清晰、格式正确且完全有效的问题。你必须给他一些信任!
-
这是一本免费下载的书,它以一种很好的方式解释了基本的 Lisp:cs.cmu.edu/~dst/LispBook
标签: function lisp common-lisp