Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 为什么赢了';常见的LISP返回函数不能工作吗?_Loops_Lisp_Common Lisp_Collect - Fatal编程技术网

Loops 为什么赢了';常见的LISP返回函数不能工作吗?

Loops 为什么赢了';常见的LISP返回函数不能工作吗?,loops,lisp,common-lisp,collect,Loops,Lisp,Common Lisp,Collect,我已经在CommonLisp中工作了一段时间,我不明白为什么我使用的循环不会返回列表。如果我在循环结束时使用“Finally”语句,它将打印新列表(正确!),但它不会打印它之外的内容,也不会让我使用它做任何事情 我发现的所有例子都表明return语句应该可以做到这一点,但当我尝试这样做时,仍然没有成功。它只是告诉我当我尝试在循环之外使用它时,meansList是未定义的,在那里初始化它也不起作用 循环的最终目标是返回每组数据元素的平均值列表 (defparameter data

我已经在CommonLisp中工作了一段时间,我不明白为什么我使用的循环不会返回列表。如果我在循环结束时使用“Finally”语句,它将打印新列表(正确!),但它不会打印它之外的内容,也不会让我使用它做任何事情

我发现的所有例子都表明return语句应该可以做到这一点,但当我尝试这样做时,仍然没有成功。它只是告诉我当我尝试在循环之外使用它时,meansList是未定义的,在那里初始化它也不起作用

循环的最终目标是返回每组数据元素的平均值列表

    (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后,它更接近我想要的内容;在要求值的变量周围加上多余的括号,将其转换为函数调用。