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 #10 Examples in Oz
% Defined in previous chapters
fun {IsZero X} X == 0 end
fun {Add1 N} N + 1 end
fun {Sub1 N} N - 1 end
fun {IsAtomS X}
   if {IsAtom X} andthen {Not X == nil}
      then true
      else {IsNumber X}
   end
end
fun {First P} P.1 end
fun {Second P} P.2.1 end
fun {Third P} P.2.2.1 end
fun {Build S1 S2} S1|S2|nil end

%%%%%%%%%%%%%%%%%%% The Little Schemer - Chapter - 10 %%%%%%%%%%%%%%%%%%%%%%

% 10.7
fun {LookupInEntry Name Entry EntryF}
   {LookupInEntryHelp Name {First Entry} {Second Entry} EntryF}
end

fun {LookupInEntryHelp Name Names Values EntryF}
   case Names
   of nil then {EntryF Name}
   [] H|T then
      if H == Name
         then Values.1
         else {LookupInEntryHelp Name T Values.2 EntryF}
      end
   end
end

% 10.2
NewEntry = Build

% 10.1
local A B C in
   A = [[appetizer entrée beverage] [paté boeuf vin]]
   B = [[appetizer entrée beverage] [beer beer beer]]
   C = [[beverage dessert] [[food is] [number one with us]]]
end

% 10.3
local Name Entry in
   Name = entrée
   Entry = [[appetizer entrée beverage] [food tastes good]]
   {Browse 3#{LookupInEntry Name Entry fun {$ _} empty end}}
end

% 10.4
local Name Entry in
   Name = dessert
   Entry = [[appetizer entrée beverage] [food tastes good]]
   {Browse 4#{LookupInEntry Name Entry fun {$ _} empty end}}
end

% 10.8
_ = [[appetizer entrée beverage] [paté boeuf vin]]
_ = [[beverage dessert] [[food is] [number one with us]]]

% 10.9
ExtendTable = fun {$ X Y} X|Y end

% 10.11
fun {LookupInTable Name Table TableF}
   case Table
   of nil then {TableF Name}
   [] H|T then {LookupInEntry Name H fun {$ Name} {LookupInTable Name T TableF} end}
   end
end

% 10.10
local Name Entry TableF in
   Name = entrée
   Entry = [[[entrée dessert] [spaghetti spumoni]]
            [[appetizer entrée beverage] [food tastes good]]]
   {Browse 10#{LookupInTable Name Entry fun {$ Name} empty end}}
end

% Note: The remainder of the chapter is rough going in Oz as
%       TLS dives into a mini Scheme type interpreter.

% 10.18
{Browse 18#[car [qoute [a b c]]]}

% 10.19
local RepA RepB RepC in
   RepA = a
   RepB = b
   RepC = c
   {Browse 19#(RepA|RepB|RepC|nil)}
end

% 10.20
local RepCar RepQuote RepA RepB RepC in
   RepCar = car
   RepQuote = quote
   RepA = a
   RepB = b
   RepC = c
   {Browse 20#(RepCar|(RepQuote|(RepA|RepB|RepC|nil)|nil)|nil)}
end

% 10.21
{Browse 21#[car [qoute [a b c]]]}

% 10.22
local E in
   E = [car [qoute [a b c]]]
   {Browse 22#E}
end

% 10.24
local E in
   E = {Add1 6}
   {Browse 24#E}
end

% 10.25
local E in
   E = 6
   {Browse 25#E}
end

% 10.26
local E in
   E = nothing
   {Browse 26#[quote E]}
end

% 10.28
local E in
   E = {fun {$ Nothing} Nothing|nil end
        ['from' nothing comes something]}
   {Browse 28#E}
end

% 10.29
local E in
   E = {fun {$ Nothing}
           if Nothing
              then something
              else nothing
           end
        end
        true}
   {Browse 29#E}
end

fun {TypeOf X}
   case X
   of quote|_ then quote
   [] lambda|_ then lambda
   [] (lambda|_)|_ then application
   [] 'cond'|_ then 'cond'
   [] true then const
   [] false then const
   [] quote then quote
   [] cons then const
   [] car then const
   [] cdr then const
   else
      if {IsNumber X}
         then const
         else identifier
      end
   end
end

% 10.30
local E in
   E = 6
   {Browse 30#{TypeOf E}}
end

% 10.31
local E in
   E = false
   {Browse 31#{TypeOf E}}
end

% 10.32
local E in
   E = false
   {Browse 32#E}
end

% 10.33
local E in
   E = cons
   {Browse 33#{TypeOf E}}
end

% 10.34
local E in
   E = car
   {Browse 34#E}
end

% 10.35
local E in
   E = [quote nothing]
   {Browse 35#{TypeOf E}}
end

% 10.36
local E in
   {Browse 36#{TypeOf e}}
end

% 10.37
local E in
   E = [lambda [x y] [cons x y]]
   {Browse 37#{TypeOf E}}
end

% 10.38
local E in
   E = [[lambda [nothing]
          ['cond'
            [nothing [quote something]]
            ['else' [quote nothing]]]]
        true]
   {Browse 38#{TypeOf E}}
end

% 10.39
local E in
   E = ['cond'
         [nothing [quote something]]
         ['else' [quote nothing]]]
   {Browse 39#{TypeOf E}}
end

% 10.44
fun {ExpressionToAction E}
   if {IsAtomS E}
      then {AtomToAction E}
      else {ListToAction E}
   end
end

fun {AtomToAction E}
   case E
   of true then Const
   [] false then Const
   [] cons then Const
   [] car then Const
   [] cdr then Const
   [] isnull then Const
   [] iseq then Const
   [] isatom then Const
   [] iszero then Const
   [] add1 then Const
   [] sub1 then Const
   [] isnumber then Const
   else
      if {IsNumber E}
         then Const
         else Identifier
      end
   end
end

% 10.45
fun {ListToAction E}
   case E
   of quote|T then Quote
   [] lambda|T then Lambda
   [] 'cond'|T then Cond
   else ApplicationS
   end
end

% 10.46
fun {Value E}
   {Meaning E nil}
end

fun {Meaning E Table}
   {{ExpressionToAction E} E Table}
end

% 10.49
fun {Const E Table}
   if {IsNumber E} then E
   elseif E == true then true
   elseif E == false then false
   else [quote primitive]|E|nil
   end
end

% 10.50
fun {Quote E Table}
   {TextOf E}
end
TextOf = Second

% 10.53
fun {Identifier E Table}
   {LookupInTable E Table InitialTable}
end

% 10.54
fun {InitialTable Name}
   fail
end

% 10.55
_ = fun {$ X} X end

% 10.60
fun {Lambda E Table}
   nonprimitive|(Table|E.2|nil)|nil
end

% 10.61
TableOf = First
FormalsOf = Second
BodyOf = Third

% 10.63
fun {EvCon Lines Table}
   if {Else {QuestionOf Lines.1}} then
      {Meaning {AnswerOf Lines.1} Table}
   elseif {Meaning {QuestionOf Lines.1} Table} == 'true' then
      {Meaning {AnswerOf Lines.1} Table}
   else
      {EvCon Lines.2 Table}
   end
end

fun {Else X}
   if {IsAtomS X}
      then X == 'else'
      else false
   end
end

QuestionOf = First
AnswerOf = Second

% 10.65
fun {Cond E Table}
   {EvCon {CondLinesOf E} Table}
end

fun {CondLinesOf L} L.2 end

% 10.68
local E Table in
   E = ['cond' [cofee klatsch] ['else' party]]
   Table = [[[cofee] ['true']]
            [[klatsch party] [5 [6]]]]
   {Browse 68#{Cond E Table}}
end

% 10.74
fun {EvLis Args Table}
   case Args
   of nil then nil
   [] H|T then {Meaning H Table} | {EvLis T Table}
   end
end

% 10.77
fun {ApplicationS E Table}
   {Apply {Meaning {FunctionOf E} Table}
           {EvLis {ArgumentsOf E} Table}}
end

% 10.78
FunctionOf = fun {$ L} L.1 end
ArgumentsOf = fun {$ L} L.2 end

% 10.81
fun {IsPrimitive L}
   {First L} == [quote primitive]
end
fun {IsNonPrimitive L}
   {First L} == [quote nonprimitive]
end

% 10.82
fun {Apply Fun Vals}
   if {IsPrimitive Fun} then
      {ApplyPrimitive {Second Fun} Vals}
   elseif {IsNonPrimitive Fun} then
      {ApplyClosure {Second Fun} Vals}
   end
end

% 10.83
fun {ApplyPrimitive Name Vals}
   case Name
   of cons then {First Vals}|{Second Vals}
   [] car then {First Vals}.1
   [] cdr then {First Vals}.2
   [] [quote iseq] then {First Vals} == {Second Vals}
   [] [quote isatom] then {IsAtomColon {First Vals}}
   [] [quote iszero] then {IsZero {First Vals}}
   [] [quote add1] then {Add1 {First Vals}}
   [] [quote sub1] then {Sub1 {First Vals}}
   [] [quote isnumber] then {IsNumber {First Vals}}
   end
end

fun {IsAtomColon X}
   if {IsAtomS X} then true
   elseif X == nil then false
   elseif X.1 == [quote primitive] then true
   elseif X.1 == [quote nonprimitive] then true
   else false
   end
end

% 10.88
fun {ApplyClosure Closure Vals}
   {Meaning {BodyOf Closure}
            {ExtendTable
               {NewEntry
                  {FormalsOf Closure}
                  Vals}
               {TableOf Closure}}}
end

% 10.89
local Closure Vals XXX YYY ZZZ in
   Closure = [[[[u v w]
                [1 2 3]]
               [[x y z]
                [4 5 6]]]
              [x y]
              [cons z x]]
   Vals = [[a b c] [d e f]]
   {Browse 89#{ApplyClosure Closure Vals}}
end

% 10.85
local F A B Table Vals in
   F = [lambda [x y] [cons x y]]
   A = 1
   B = [2]
   % not sure what the call is here
end

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