Почему я не могу заставить работать функциональные методы?

Мои занятия:

declare
class Collection
   attr list

   meth init
      list := nil
   end

   meth put(X)
      list := X|@list
   end

   meth get($)
      if @list == nil then
         nil
      else
         local X in
            X = @list.1
            list := @list.2
            X
         end
      end
   end
end

Мое тестовое использование:

declare
C = {New Collection init}
{C put(4)}
{C put(5)}
{Browse {C get}}

Ошибка:

%********************** static analysis error *******************
%**
%** illegal number of arguments in object application
%**
%** Object:       C
%** Number found: 2
%** Expected:     1
%** in file "Oz", line 62, column 9
%** ------------------ rejected (1 error)

Строка 62 — это строка с надписью "Обзор"


Это потому, что Оз пытается использовать объектную процедуру как функцию, передавая аргумент результата? Если да, то в чем смысл функциональных методов? Как их использовать?


person Hubro    schedule 13.04.2014    source источник


Ответы (1)


Синтаксис вызова такого метода следующий:

{Browse {C get($)}}

Причина в том, что объекты в основном представляют собой процедуры с состоянием, которые получают сообщения. (Синтаксис необычен и поначалу труден для понимания. Однако он очень регулярен и мощен.)

person wmeyer    schedule 13.04.2014
comment
Спасибо. Я понятия не имею, как бы я вообще это понял, если бы ты мне не сказал. Оз, похоже, не самый тщательно задокументированный язык. - person Hubro; 13.04.2014