About TLS The following Oz code is derived from the examples provided in the book:
      "The Little Schemer" by Daniel P. Friedman and Matthias Felleisen.
      http://www.ccs.neu.edu/home/matthias/BTLS/

TLS Chapter #06 Examples in Oz
% Defined in previous chapters
fun {IsAtomS X}
   if {IsAtom X} andthen {Not X == nil}
      then true
      else {IsNumber X}
   end
end

%%%%%%%%%%%%%%%%%%% The Little Schemer - Chapter - 6 %%%%%%%%%%%%%%%%%%%%%%

% 6.1
{Browse 1#1}

% 6.2
{Browse 2#3}

% 6.3
{Browse 3#(1 + 3)}

% 6.4
{Browse 4#(1 + 3 * 4)}

% 6.5
{Browse 5#cookie}

% 6.6
local Y in
   Y = 3
   {Browse 6#{Pow 3 Y} + 5}
end

% 6.8
{Browse 8#'a'}

% 6.9
{Browse 9#'+'}
% 6.10
{Browse 10#'*'}
% 6.11
local Y in
   Y = a
   {Browse 11#('a' == Y)}
end

% 6.12
local X Y in
   X = a
   Y = a
   {Browse 12#(X == Y)}
end

% 6.13
local N in
   N = 3
   {Browse 13#(N + 3)}
end

% 6.37
fun {IsNumbered AExp}
   if {IsAtomS AExp}
      then {IsNumber AExp}
      else {IsNumbered AExp.1} andthen {IsNumbered AExp.2.2.1}
   end
end

% 6.45 and 6.51
fun {ValueM NExp}
   case NExp
   of X|'+'|Y|nil then {ValueM X} + {ValueM Y}
   [] X|'*'|Y|nil then {ValueM X} * {ValueM Y}
   [] X|'^'|Y|nil then {Pow {ValueM X} {ValueM Y}}
   else
      if {IsNumber NExp}
         then NExp
         else raise domain("Malformed expression") end
      end
   end
end

% 6.39
local U in
   U = 13
   {Browse 39#{ValueM U}}
end

% 6.40
local X in
   X = [1 '+' 3]
   {Browse 40#{ValueM X}}
end

% 6.41
local Y in
   Y = [1 '+' [3 '^' 4]]
   {Browse 41#{ValueM Y}}
end

% 6.42
local Z in
   Z = cookie
   try
      {Browse 42#{ValueM Z}}
   catch _ then
      skip
   end
end

% 6.48
{Browse 48#{ValueM [1 '+' [3 '*' 4]]}}

% 6.57
fun {Value NExp}
   case NExp
   of '+'|X|Y|nil then {Value X} + {Value Y}
   [] '*'|X|Y|nil then {Value X} * {Value Y}
   [] '^'|X|Y|nil then {Pow {Value X} {Value Y}}
   else
      if {IsNumber NExp}
         then NExp
         else raise domain("Malformed expression") end
      end
   end
end

% 6.56
{Browse 56#{Value ['+' ['*' 3 6] ['^' 8 2]]}}

% 6.59
{Browse 59#{Value ['+' 1 3]}}

% 6.69
fun {FirstSubExp AExp}
   case AExp
   of _|X|_ then X
   end
end

% 6.72
fun {SecondSubExp AExp}
   case AExp
   of _|_|Y|_ then Y
   end
end

% 6.73
fun {Operator AExp}
   case AExp
   of H|_ then H
   end
end

% 6.74
fun {Value_ NExp}
   if {IsNumber NExp}
      then NExp
      else
         case {Operator NExp}
         of '+' then {Value_ {FirstSubExp NExp}} + {Value_ {SecondSubExp NExp}}
         [] '*' then {Value_ {FirstSubExp NExp}} * {Value_ {SecondSubExp NExp}}
         [] '^' then {Pow {Value_ {FirstSubExp NExp}} {Value_ {SecondSubExp NExp}}}
         end
   end
end

% 6.76
fun {FirstSubExp1 AExp}
   case AExp
   of X|_|_ then X
   end
end

fun {Operator1 AExp}
   case AExp
   of _|H|_ then H
   end
end

% 6.84
Zero = nil

% 6.85
One = [nil]

% 6.86
Two = [nil nil]

% 6.87
Three = [nil nil nil]

% 6.88
fun {IsSero L}
   case L
   of nil then true
   else false
   end
end

% 6.89
fun {Edd1 L}
   nil|L
end

% 6.88
fun {Zub1 L}
   case L
   of H|T then T
   end
end

% 6.92
local N in
   N = nil
   try
      {Browse 92#{Zub1 N}}
   catch _ then
      skip
   end
end

% 6.93
fun {Plus M N}
   if {IsSero N}
      then M
      else {Edd1 {Plus M {Zub1 N}}}
   end
end

% 6.95
fun {IsLat L}
   if L == nil
      then true
      elseif {IsAtomS L.1} then
         {IsLat L.2}
      else false
   end
end

% 6.96
local Ls in
   Ls = [1 2 3]
   {Browse 96#{IsLat Ls}}
end

% 6.98
local Ls in
   Ls = [[nil] [nil nil] [nil nil nil]]
   {Browse 97#{IsLat Ls}}
end

Chris Rathman / Chris.Rathman@tx.rr.com