| << Prev | - Up - | 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%  
%%  Program collection on functional programming in Oz
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
%%%%%%%%%%%%%% browse values %%%%%%%%%%%%%%%%%%%%%%%%%%
declare A = 'Maria'
declare L = [A 'Klaus']
declare R = address(street:'Talstrasse'
name:unit(first:hans
second:kamp)
kids:L)
declare T = tuple(A L R)
{Inspect T}
 %%%%%%%%%%%%%% browse types %%%%%%%%%%%%%%%%%%%%%%%%%%%% 
{Inspect {IsRecord R}}
{Inspect {IsRecord F}}
 
{Inspect {Or {IsRecord ~100}
          {IsBool ~100}}}
{Inspect {And {And
               {IsNumber ~100}
               {IsInt ~100}}
          {IsFloat ~100}}}
 
{Inspect {Not {IsRecord false}}}
{Inspect {IsRecord {IsRecord false}}}
 
{Inspect {And
          {And
           {IsList L}
           {IsTuple L}}
          {IsRecord L}}}
 
 
 %%%%%%%%%%%%%% browse status %%%%%%%%%%%%%%%%%%%%%%%%%%% 
{Inspect [{Value.status R}
          {Value.status T}
          {Value.status L}
          {Value.status F}]}
 
 
 %%%%%%%%%%%%%% test equality %%%%%%%%%%%%%%%%%%%%%%%%%%% 
{Inspect atom==atom()}
{Inspect {IsRecord atom}}
 
{Inspect {And true==true()
          {And unit==unit()
           false==false()}}}
 
{Inspect "hiho"==[104 105 104 111]}
 %%%%% procedures  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% functions on numbers 
declare Square = fun{$ N} N*N end
 %% dollar free syntax 
declare fun{Square N} N*N end
 %% application of functions 
{Inspect {Square 4}}
 %% functions with serveral inputs 
%% an arithmetic test
declare Square = fun{$ X} X*X end
declare fun{Test X Y Z}
{Square X} + {Square Y} == {Square Z}
end
{Inspect {Test 3 4 5}}
 %% relational procedures 
declare proc{MyInspect X}
{Show X}
{Inspect ['MyInspect: ' X]}
end
{MyInspect hiho}
 %% browsing functional procedures 
declare Square = fun{$ X} X*X end
{Inspect ['Browsing fun{$ X} X*X end yields <P/2>' Square]}
{Inspect {Square 111}}
 %% functions for type coercion 
declare fun{NumberToFloat N}
if {IsFloat N}
then N
else {IntToFloat N}
end
end
%% summation of floats to integers requires type conversion
{Inspect {NumberToFloat 3.3}+{NumberToFloat 2}}
 %% recursive functions on integers 
%% {Factorial N} = N * ... * 1
declare fun{Factorial N}
if N==0
then 1
else N*{Factorial N-1}
end
end
{Inspect {Factorial 3}}
{Inspect {Factorial 1111}}
 %%%%% records %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
word(cat:noun phon:[girl] subcat:determiner)
{Inspect word(cat:noun phon:[girl] subcat:determiner).phon}
{Inspect word(cat:noun phon:[girl] subcat:determiner).phon.1}
{Inspect FD}
{Inspect Record}  
   
%%%%% lists %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% a list representing a simple lexicon
declare WordReps=[[mary noun nil]
[john noun nil]
[girl noun determiner]
[nice adjective nil]
[pretty adjective nil]
[the determiner nil]
[laughs verb noun]
[meets verb [noun noun]]
[kisses verb [noun noun]]
[embarrasses verb [noun noun]]
[thinks verb [verb noun]]
[is verb [adjective noun]]
[met adjective nil]
[kissed adjective nil]
[embarrassed adjective nil]]
{Inspect WordReps}
%% convert lists to records
declare fun{Convert [P C S]}
word(phon:[P] cat:C subcat:S)
end
declare Words = {Map WordReps Convert}
{Inspect Words}
declare Verbs = {Filter Words fun{$ W}
W.cat == verb
end}
{Inspect Verbs}
 %%%%% pattern matching %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%% decomposing data structures
declare unit(hi:X ho:unit(Y)) = unit(hi:'blue'('tain') ho:unit(jazz))
{Inspect [X Y]}
%% pattern matching conditionals and recursion
declare fun{SquareList Ints}
case Ints
of I|Is then I*I | {SquareList Is}
elseof nil then nil
end
end
{Inspect {SquareList [1 2 3 4 5]}}
{Inspect {SquareList {SquareList [1 2 3 4 5]}}}
 %%%%% loops %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
declare proc{InspectAll List}
for X in List do {Inspect X} end
end
{InspectAll [5 4 3 2 1]}
 %%%%%%%%%%%%%% free variables%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%%%%%%%% Free, Kinded, and Determined Variables %%%%%%%%%%%%%%%%
declare X Y Z=1
Y :: 1#7
{Browse status(x:{Value.status X}
y:{Value.status Y}
z:{Value.status Z})}
{Wait X} {Browse 'will browse if you feed the line X=1 separately'}
X=1
{Browse newStatus(x:{Value.status X}
y:{Value.status Y}
z:{Value.status Z})}
 %%%%% abstract data types, modules, and stacks %%%%%%%%% 
%% maybe change the ADS_URL to an appropriate local filename
declare AuthorURL = 'http://www.ps.uni-sb.de/~niehren'
declare CourseDir = 'Web/Vorlesungen/Oz-NL-SS01/vorlesung'
declare CourseURL = AuthorURL#'/'#CourseDir
declare ADS_URL= URL#'/Functors/&pickle.version/Abstract.ozf'
%% load the module with the abstract data structures
declare [ADS_Module] = {Module.link [ADS_URL]}
%% select the abstract data structure for the stack (class)
declare NewStack = ADS_Module.newStack
%% create a new stack (object)
declare Stack = {NewStack}
%% now we can use this stack
{Inspect {Stack.isEmpty}}
{Stack.push 5}
{Stack.push 27}
{Inspect {Stack.isEmpty}}
{Inspect {Stack.pop}}
| << Prev | - Up - |