Loops 为什么赢了';常见的LISP返回函数不能工作吗?
我已经在CommonLisp中工作了一段时间,我不明白为什么我使用的循环不会返回列表。如果我在循环结束时使用“Finally”语句,它将打印新列表(正确!),但它不会打印它之外的内容,也不会让我使用它做任何事情 我发现的所有例子都表明return语句应该可以做到这一点,但当我尝试这样做时,仍然没有成功。它只是告诉我当我尝试在循环之外使用它时,meansList是未定义的,在那里初始化它也不起作用 循环的最终目标是返回每组数据元素的平均值列表Loops 为什么赢了';常见的LISP返回函数不能工作吗?,loops,lisp,common-lisp,collect,Loops,Lisp,Common Lisp,Collect,我已经在CommonLisp中工作了一段时间,我不明白为什么我使用的循环不会返回列表。如果我在循环结束时使用“Finally”语句,它将打印新列表(正确!),但它不会打印它之外的内容,也不会让我使用它做任何事情 我发现的所有例子都表明return语句应该可以做到这一点,但当我尝试这样做时,仍然没有成功。它只是告诉我当我尝试在循环之外使用它时,meansList是未定义的,在那里初始化它也不起作用 循环的最终目标是返回每组数据元素的平均值列表 (defparameter data
(defparameter data
' ((2.0 8.0) (0.9 1.2) (6.0 2.0)
(7.0 3.5) (4.0 6.0) (1.0 4.0)))
(loop for i in data
do (setq j (mean i)) collect j into meansList
finally (return (meansList))
mean函数返回列表的平均值。我已经检查了好几次,结果正常,不过如果需要,我可以在这里提供。(meansList)
意味着不带参数地应用函数meansList
。由于Common Lisp是一个Lisp2,您会得到一个错误,即函数meansList
不存在。如果您了解C类型语言,那么您可以这样做:
int c = 10;
return c(); // is this the variable that turns into 10?
(loop :for i :in *data*
:collect (mean i) :into meansList
:finally (return meansList))
对于全局变量,还应该考虑使用<代码> *耳罩* >代码>,因为它们是动态的。如果有一个名为data
的参数调用一个依赖全局data
的函数,它将被临时更改,甚至在中等项目中,这就像大海捞针一样
还要注意,loop
创建了一个名为nil
的块,return
使用了最近的名为nil
的块,因此您是从loop
返回的。它变成了对循环的评估。要从使用循环的函数返回,需要使用(从函数名返回要计算值的任何表达式)
我还发现有一个不必要的j
突变。可以这样写:
int c = 10;
return c(); // is this the variable that turns into 10?
(loop :for i :in *data*
:collect (mean i) :into meansList
:finally (return meansList))
如果您收集
任何东西,但未提及它将返回的位置,则这是相同的:
(loop :for i :in *data*
:collect (mean i))
《quine nice》一章中的例子和(数据收集中的i循环(平均值i)进入平均值列表)如下?这似乎也不起作用。当我试图打印它时,它仍然告诉我meansList的值不存在。此外,如果您不告诉它返回到哪里,以后如何使用它?@kra361
meansList
只能从循环中访问。这是表格的结果,即两个表格中收集的值列表。你可以(print(loop…)
或者(let((ml(loop…))(print ml))
@kra361作为补充:这个代码可以是(mapcar#mean*data*)
我想我只是误解了循环输出在这个例子中的工作方式。在查看mapcar后,它更接近我想要的内容;在要求值的变量周围加上多余的括号,将其转换为函数调用。