2009-09-23 3 views
6

Я пытаюсь создать список в Oz, используя следующий код:Как создать список в 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.

Что не так с кодом?

ответ

7

Не уверен, что это то, что вы хотите, но чтобы создать список всех целых чисел между 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 
+0

Спасибо. Я сам наткнулся на тот же метод. Хотя для того, чтобы вернуть правильный список, второй аргумент Loop должен быть To | nil, чтобы список всегда заканчивался нулем. спасибо. –

+0

О, ты прав. Теперь это исправлено. – sepp2k

+1

На мой взгляд, более безопасно и логичнее делать 'if From yakoudbz

3

также причина, почему вы не получаете любой браузер окно, потому что нить оценка приостановить из-за этой линии:

Xs={List.append Xs I} 

Как уже упоминалось ранее переменная может быть назначен только один раз, но есть что-то еще, что не так с этой линией. Вы пытаетесь добавить Xs к I, но Xs по-прежнему несвязан. Таким образом, нить приостанавливается до тех пор, пока значение не будет присвоено Xs.

Введите это в интерактивном режиме:

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

Как вы видите, ничего не происходит, ни один браузер не открывает. Теперь введите это:

Xs= [1] 

С Xs становится связанным он разблокирует первую оценку «нить» и браузер будет всплывающим.

P.S. Извините за поздний ответ, меня просто интересовал Oz: P

+0

Это сработало, когда я заменил 'List.append' на' Append' – Anand

 Смежные вопросы

  • Нет связанных вопросов^_^