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 #04 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 - 4 %%%%%%%%%%%%%%%%%%%%%%

% 4.1
{Browse 1#{IsAtomS 14}}

% 4.2
local N in
   N = 14
   {Browse 2#{IsAtomS N}}
end

% 4.3
{Browse 1#{IsNumber ~3}}

% 4.4
{Browse 4#{IsNumber 3.14159}}

% 4.5
% {Browse 5#({IsNumber ~3} andthen {IsNumber 3.14159})}

% 4.6
fun {Add1 N} N + 1 end
local N in
   N = 67
   {Browse 6#{Add1 N}}
end

% 4.7
{Browse 7#{Add1 67}}

% 4.8
fun {Sub1 N} N - 1 end
local N in
   N = 5
   {Browse 8#{Sub1 N}}
end

% 4.9
{Browse 9#{Sub1 0}}

% 4.10
fun {IsZero X} X == 0 end
{Browse 10#{IsZero 0}}

% 4.11
{Browse 10#{IsZero 1492}}

% 4.12
{Browse 12#(46 + 12)}

% 4.13
fun {Add M N}
   if {IsZero N}
      then M
      else {Add {Add1 M} {Sub1 N}}
   end
end

% 4.16
{Browse 16#(14 - 3)}

% 4.17
{Browse 17#(17 - 9)}

% 4.18
{Browse 18#(18 - 25)}

% 4.19
fun {Subtract M N}
   if {IsZero N}
      then M
      else {Subtract {Sub1 M} {Sub1 N}}
   end
end

% 4.21
{Browse 21#[2 11 3 79 47 6]}

% 4.22
{Browse 22#[8 55 5 555]}

% 4.23
{Browse 23#[1 2 8 apple 4 3]}

% 4.24
{Browse 24#[3 [7 4] 13 9]}

% 4.25
{Browse 25#nil}

% 4.26
fun {AddTup Tup}
   case Tup
   of nil then 0
   [] H|T then
      if {IsNumber H}
         then {Add H {AddTup T}}
         else fail
      end
   end
end
local Tup in
   Tup = [3 5 2 8]
   {Browse 26#{AddTup Tup}}
end

% 4.27
local Tup in
   Tup = [15 6 7 12 3]
   {Browse 27#{AddTup Tup}}
end

% 4.53
{Browse 53#(5 * 3)}

% 4.54
{Browse 54#(13 * 4)}

% 4.60
fun {Times M N}
   if {IsZero N}
      then 0
      else {Add M {Times M {Sub1 N}}}
   end
end

% 4.61
{Browse 61#{Times 12 3}}

% 4.77
fun {TupPlus Tup1 Tup2}
   case Tup1#Tup2
   of nil#_ then Tup2
   [] _#nil then Tup1
   [] (H1|T1)#(H2|T2) then {Add H1 H2}|{TupPlus T1 T2}
   else fail
   end
end
local Tup1 Tup2 in
   Tup1 = [3 6 9 11 4]
   Tup2 = [8 5 2 0 7]
   {Browse 77#{TupPlus Tup1 Tup2}}
end

% 4.78
local Tup1 Tup2 in
   Tup1 = [2 3]
   Tup2 = [4 6]
   {Browse 78#{TupPlus Tup1 Tup2}}
end

% 4.89
local Tup1 Tup2 in
   Tup1 = [3 7]
   Tup2 = [4 6]
   {Browse 89#{TupPlus Tup1 Tup2}}
end

% 4.98
local Tup1 Tup2 in
   Tup1 = [3 7]
   Tup2 = [4 6 8 1]
   {Browse 98#{TupPlus Tup1 Tup2}}
end

% 4.101
local Tup1 Tup2 in
   Tup1 = [3 7 8 1]
   Tup2 = [4 6]
   {Browse 101#{TupPlus Tup1 Tup2}}
end

% 4.107
{Browse 107#(12 > 133)}

% 4.108
{Browse 108#(120 > 11)}

% 4.113
fun {GT X Y}
   if {IsZero X}
      then false
      elseif {IsZero Y} then true
      else {GT {Sub1 X} {Sub1 Y}}
   end
end

% 4.114
{Browse 114#{GT 3 3}}

% 4.130
{Browse 130#(4 < 6)}

% 4.131
{Browse 131#(8 < 3)}

% 4.132
{Browse 132#(6 < 6)}

% 4.133
fun {LT X Y}
   if {IsZero Y}
      then false
      elseif {IsZero X} then true
      else {LT {Sub1 X} {Sub1 Y}}
   end
end

% 4.134
fun {EQ X Y}
   if {IsZero X}
      then
         if {IsZero Y}
            then true
            else false
         end
      else {EQ {Sub1 X} {Sub1 Y}}
   end
end
fun {EQ2 X Y}
   if {GT X Y}
      then false
      elseif {LT X Y} then false
      else true
   end
end
{Browse 134#{EQ2 3 3}}

% 4.136
{Browse 136#{Pow 1 1}}

% 4.137
{Browse 137#{Pow 2 3}}

% 4.138
{Browse 138#{Pow 5 3}}

% 4.139
fun {Power M N}
   if {IsZero N}
      then 1
      else {Times M {Power M {Sub1 N}}}
   end
end

% 4.140
fun {Divide M N}
   if {LT M N}
      then 0
      else {Browse b#M#N}{Add1 {Divide {Subtract M N} N}}
   end
end

% 4.145
{Browse 145#(15 div 4)}

% 4.147
local Lat in
   Lat = [hotdogs with mustard sauerkraut and pickles]
   {Browse 147#{Length Lat}}
end

% 4.148
local Lat in
   Lat = [ham and cheese on rye]
   {Browse 148#{Length Lat}}
end

% 4.149
fun {LengthX L}
   case L
   of nil then 0
   [] _|T then {Add1 {LengthX T}}
   end
end

% 4.150
local Lat in
   Lat = [lasagna spaghetti ravioli macaroni meatball]
   {Browse 150#{Nth Lat 4}}
end

% 4.151
local Lat in
   Lat = [a]
   try
      {Browse 151#{Nth Lat 0}}
   catch _ then
      skip
   end
end

% 4.152
fun {Pick L N}
   case L
   of H|T then
      if {IsZero {Sub1 N}}
         then H
         else {Pick T {Sub1 N}}
      end
   else fail
   end
end

% 4.154
fun {RemPick L N}
   case L
   of H|T then
      if {IsZero {Sub1 N}}
         then T
         else H|{RemPick T {Sub1 N}}
      end
   [] nil then nil
   else fail
   end
end

% 4.153
local Lat in
   Lat = [hotdogs with hot mustard]
   {Browse 153#{RemPick Lat 3}}
end

% 4.155
{Browse 155#{IsNumber a}}

% 4.156
{Browse 156#{IsNumber 76}}

% 4.158
fun {NoNums L}
   case L
   of nil then nil
   [] H|T then
      if {IsNumber H}
         then {NoNums T}
         else H|{NoNums T}
      end
   else fail
   end
end

% 4.159
fun {AllNums L}
   case L
   of nil then nil
   [] H|T then
      if {IsNumber H}
         then H|{AllNums T}
         else {AllNums T}
      end
   else fail
   end
end

% 4.160
fun {Eqan A1 A2}
   if {IsNumber A1} andthen {IsNumber A2}
      then A1 == A2
      elseif {IsNumber A1} orelse {IsNumber A2} then false
      else A1 == A2
   end
end

% 4.162
fun {Occur L A}
   case L
   of nil then 0
   [] H|T then
      if A == H
         then {Add1 {Occur T A}}
         else {Occur T A}
      end
   else fail
   end
end

% 4.163
fun {IsOne N}
   if {IsZero N}
      then false
      else {IsZero {Sub1 N}}
   end
end

% 4.164
fun {IsOneX N}
   N == 1
end

% 4.165
fun {RemPickX L N}
   case L
   of H|T then
      if {IsOne N}
         then T
         else H|{RemPickX T {Sub1 N}}
      end
   [] nil then nil
   else fail
   end
end

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