В настоящее время я беру курс обучения в университете и замечаю, что я откусил немного больше, чем могу пережевывать. Курс посвящен языку программирования Oz, и я читаю электронную книгу об этом, чтобы лучше узнать его, и я пытаюсь решить некоторые упражнения, чтобы проверить мое понимание. Я довольно застрял в определенном упражнении, и я не совсем понимаю, как его решить. Вопрос:Порты и ячейки в Оз
Реализация портов. В главе 5 мы ввели понятие порта, , который является простым каналом связи. Порты имеют операции {NewPort S P}, которые возвращают порт P с потоком S и {Send P X}, , который отправляет сообщение X на порт P. Из этих операций видно, что порты представляют собой разделенный на состояние ОБЪЯВЛЕНИЕ ADT. Для этого выполните реализацию портов в терминах ячеек, используя методы раздела 6.4.
Ключевые слова с сохранением состояния и элементы. Я пытался реализовать поведение портов с использованием клеток со следующим подходом:
declare
MyPort
MyStream
proc {NewPortEx ?S ?P}
P = {NewCell nil}
S = !!P %read only view on the cell
end
proc {SendEx P X}
P:=X|@P %extend the cell's content, a list, with X
end
in
{NewPortEx MyStream MyPort}
{Browse @MyStream}
{SendEx MyPort c}
{Browse @MyStream}
Мой последний шаг будет добавить обертку/пару для развертывания для обеспечения защиты ADT, но сначала я хочу функциональность, чтобы работать должным образом. Это похоже на правильное поведение, но это не так, как я этого хотел. Я хотел был бы иметь возможность позвонить {Browse MyStream}
, без @
, только один раз. Я надеялся, что браузер отобразит что-то по линиям firstSent|secondSent|_<future>
, вместо этого отобразит <Cell>
, как и следовало ожидать, и мне нужно вызвать Browse
на него после каждого Send
, а вывод будет показан в виде списка: [firstSent secondSent]
.
Если я правильно помню теорию, которую я читал, это связано с нетерпением и ленивой оценкой, соответственно приводящей к (конечным) спискам vs (бесконечных) потоков.
У меня такое чувство, что я не делаю это совершенно правильно, хотя у меня нет опыта с функциональными языками, может ли кто-нибудь помочь мне с примером порта, реализованного с помощью ячеек? (В основном ваша собственная реализация существующего NewPort
и Send
)
Спасибо заранее
FYI (и не имеет значения) фраза: «Я откусила больше, чем я могу пережевывать» :-) – paxdiablo
Спасибо, я не носитель английского языка, но я исправлю это: P – Warkst