Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Oz (язык программирования) - Примеры программ на языке Oz30 марта 2011Оглавление: 1. Oz (язык программирования) 2. Особенности языка 3. Обзор языка 4. Примеры программ на языке Oz Решето ЭратосфенаВ данном примере вычисляется поток простых чисел с использованием алгоритма решето Эратосфена. Для этого рекурсивно создаются параллельные потоки, которые отсеивают сложные числа: fun {Sieve Xs} case Xs of nil then nil X|Xr then Ys in thread Ys = {Filter Xr fun {$ Y} Y mod X \= 0 end} end X|{Sieve Ys} end end Ленивые вычисленияПо-умолчанию, Oz использует модель ленивых вычислений, но также поддерживает и т.наз. энергичные вычисления: fun lazy {Fact N} if N =< 0 then 1 else N*{Fact N-1} end end local X Y in X = {Fact 100} Y = X + 1 % поскольку требуется значение X, оно вычисляется именно в этот момент end Передача сообщенийМодель декларативного параллелизма может быть расширена с использованием механизма передачи сообщений: declare local Stream Port in Port = {NewPort Stream} {Send Port 1} % Stream is now 1|_ {Send Port 2} % Stream is now 1|2|_ ... {Send Port n} % Stream is now 1|2| .. |n|_ end Создание асинхронных агентов реализуется с помощью потоков и портов: fun {NewAgent Init Fun} Msg Out in thread {FoldL Msg Fun Init Out} end {NewPort Msg} end Состояния и объектыМодель декларативного параллелизма может быть расширена с целью поддержки концепции состояния и объектно-ориентированного программирования; для этого необходимо создать структуру данных Cells, значение которой может быть изменено: local A X in A = {NewCell 0} A := 1 % changes the value of A to 1 X = @A % @ is used to access the value of A end Благодаря такому незначительному расширению семантики можно использовать всю мощь объектно-ориентированного программирования: class Counter attr val meth init val:=Value end meth browse {Browse @val} end meth inc val :=@val+Value end end local C in C = {New Counter init} {C inc} {C browse} end Пример программы на языке Oz, решающей ребусУсловие: ФУТ +БОЛ --- ИГРА Где И=0 и все различные буквы означают различные цифры. Решение: local Fut Res in proc {Fut C} F#U#T#B#O#L#G#R#A = C in C ::: 0#9 {FD.distinct C} F \=: 0 B \=: 0 100 * F + 10* U + T + 100*B + 10*O + L =: 100*G + 10*R + A {FD.distribute ff C} end {SearchAll Fut Res} {Browse Res} end покажет все решения данного ребуса в виде таблицы. Просмотров: 3769
|