【问题标题】:How do I create a list in Oz?如何在 Oz 中创建列表?
【发布时间】:2010-11-30 14:41:14
【问题描述】:

我正在尝试使用以下代码在Oz 中创建一个列表:

local Loop10 Xs in
   proc {Loop10 I}
      Xs={List.append Xs I}
      if I == 10 then skip
      else
     {Browse I}
     {Loop10 I+1}
      end
      {Browse Xs}
   end
{Loop10 0}
end

Mozart compiler 表明代码已被接受,但没有打开浏览窗口。我要做的就是在 Oz 中创建一个列表。

代码有什么问题?

【问题讨论】:

    标签: oz mozart


    【解决方案1】:

    不确定这是否是您想要的,但要创建一个包含 X 和 Y(含)之间所有整数的列表,您可以这样做:

    local
       fun {Loop From To}
          if From > To
          then nil
          else From | {Loop From+1 To}
          end
       end
    in
       {Browse {Loop 0 10}} % Displays: [0,1,2,3,4,5,6,7,8,9,10]
    end
    

    【讨论】:

    • 谢谢。实际上,我自己也偶然发现了同样的方法。尽管为了返回正确的列表, Loop 的第二个参数必须为 To|nil,以便列表始终以 nil 终止。谢谢。
    • 在我看来,if From < To then nil 更安全、更合乎逻辑,因为你可以给一个小于“From”的“To”并得到 nil(而不是像上面程序中那样的无限列表)
    • @yakoudbz 好点(除了应该是>,而不是<)。完成。
    【解决方案2】:

    另外你没有看到任何浏览器窗口的原因是评估线程由于这一行而暂停:

    Xs={List.append Xs I}
    

    正如前面提到的,一个变量只能被赋值一次,但这一行还有其他问题。 您尝试将 Xs 附加到 I 但 Xs 仍然未绑定。线程因此暂停,直到为Xs 分配了一个值。

    以交互方式输入:

    declare Xs in
    {Browse {List.append Xs [2 3 4]}}
    

    当您看到没有任何反应时,没有打开浏览器。现在输入:

    Xs= [1]
    

    由于Xs 被绑定,它会解锁第一个评估“线程”并且会弹出浏览器。

    附:抱歉回答晚了,我只是对 Oz 感兴趣:P

    【讨论】:

    • 当我将 List.append 替换为 Append 时,这有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多