Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - 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
покажет все решения данного ребуса в виде таблицы. Просмотров: 4364
|