Function 莫扎特Oz中相同代码的函数和过程表现不同?

Function 莫扎特Oz中相同代码的函数和过程表现不同?,function,procedure,oz,mozart,Function,Procedure,Oz,Mozart,我尝试在Oz中使用2种方法打印斐波那契序列:使用Emac作为编辑器的函数和过程。 程序如下: declare fun {Fibo N} case N of 1 then 1 [] 2 then 1 [] M then {Fibo (M-1)} + {Fibo (M-2)} end end declare proc {Loop K} if K ==1 then {Browse K} else {Loop K-1}

我尝试在Oz中使用2种方法打印斐波那契序列:使用Emac作为编辑器的函数和过程。 程序如下:

declare 
fun {Fibo N} 
   case N of 
      1 then 1 
   [] 2 then 1
[] M then {Fibo (M-1)} + {Fibo (M-2)} 
   end 
end 
declare
proc {Loop K}
   if K ==1 then  {Browse K}
   else
      {Loop K-1}
       {Browse {Fibo K}}
   end
end
{Loop 10}
和功能:

declare 
fun {Fibo N} 
   case N of 
      1 then 1 
   [] 2 then 1
[] M then {Fibo (M-1)} + {Fibo (M-2)} 
   end 
end
declare
fun {Loo L}
   if L ==1 then  {Browse L}
   else
      {Loo L-1}
       {Browse {Fibo L}}
   end
end
{Loo 10}
问题是“循环”唯一有效的程序。结果是:

1
1
2
3
5
8
13
21
34
55
函数“Loo”没有,它会抛出一些难以理解的错误:

%********************** static analysis error *******************
%**
%** illegal arity in application
%**
%** Arity found:          1
%** Expected:             2
%** Application (names):  {Loo _}
%** Application (values): {<P/2> _<optimized>}
%** in file "Oz", line 13, column 6

%********************** static analysis error *******************
%**
%** illegal arity in application
%**
%** Arity found:          1
%** Expected:             2
%** Application (names):  {Loo _}
%** Application (values): {<P/2> 10}
%** in file "Oz", line 17, column 0
%** ------------------ rejected (2 errors)
%****************静态分析错误*******************
%**
%**应用中的非法计算
%**
%**发现的数量:1
%**预期:2
%**应用程序(名称):{Loo}
%**应用程序(值):{}
%**在文件“Oz”第13行第6列中
%**********************静态分析误差*******************
%**
%**应用中的非法计算
%**
%**发现的数量:1
%**预期:2
%**应用程序(名称):{Loo}
%**应用程序(值):{10}
%**在文件“Oz”第17行第0列中
%**--------------拒绝(2个错误)

我还是不知道为什么。我认为函数和过程在OZ中有类似的效果。

第13行的
Loo
定义中有一个输入错误

您正在调用不存在的
循环。我想你应该打电话给
Loo

更新:您看到的是函数和过程之间的差异;函数总是返回值,而过程则不返回。您为
Loo
K-1
)提供了一个参数,但是
Loo
需要两个参数;一个输入变量和一个用于捕获返回值的变量。Oz告诉您,您对
Loo
应用了错误的算术(您应用了一个参数(一元),而您应该应用两个参数(二进制))

这意味着您还必须将返回值分配给变量。执行以下操作之一:

  • A={look-1}
  • {look-1 A}

  • A
    是将为其分配返回值的变量。对于不关心函数返回内容的情况,一个常见的约定是使用
    \uu
    作为返回变量名。

    必须使用函数调用语法调用函数:

    _ = {Loo 10}
    
    或者,使用附加参数来接收值:

    {Loo 10 _}
    
    \
    发音为“不在乎”,表示不需要变量的值

    此外,函数必须通过将表达式作为每个分支的最后一部分来返回值。因此,您的固定
    Loo
    函数如下所示:

    fun {Loo L}
       if L == 1 then
          {Browse L}
          unit
       else
          _ = {Loo L-1}
          {Browse {Fibo L}}
          unit
       end
    end
    _ = {Loo 10}
    

    然而,如果您没有任何有趣的返回,那么使用这样的函数进行循环就没有多大意义。也许你真正想做的是?

    thnks。它起作用了。我想问“单位”的任务是什么?@silentbang:
    unit
    只是一个值。将“unit”写为分支的最后一部分将返回它。您可以使用任何其他值(如
    42
    “hello”
    ),但按照惯例,当没有有意义的值可用时,将使用
    单位