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

TSS Chapter #18 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

%%%%%%%%%%%%%%%%%%% The Little Schemer - Chapter - 18 %%%%%%%%%%%%%%%%%%%%%%

% 18.24
fun {Kons Kar Kdr}
   X = {NewCell Kar}
   Y = {NewCell Kdr}
in
   fun {$ Selector}
      {Selector X Y}
   end
end
fun {Kar C}
   {C fun {$ A D} @A end}
end
fun {Kdr C}
   {C fun {$ A D} @D end}
end

% 18.12
Kounter
SetKounter
local
   N = {NewCell 0}
in
   Kounter = fun {$} @N end
   SetKounter = fun {$ X} N := X @N end
   fun {KonsC X Y}
      N := {Add1 @N}
      {Kons X Y}
   end
end

% 18.7
fun {Lots M}
   if {IsZero M}
      then nil
      else {KonsC egg {Lots {Sub1 M}}}
   end
end
fun {Lenkth L}
   if L == nil
      then 0
      else {Add1 {Lenkth {Kdr L}}}
   end
end

% 18.8
{Browse 8#{KonsC egg {Lots 3}}}

% 18.1
{Browse 1#{Lots 3}}

% 18.2
{Browse 2#{Lots 5}}

% 18.3
{Browse 3#{Lots 12}}

% 18.4
{Browse 4#{Lenkth {Lots 3}}}

% 18.5
{Browse 5#{Lenkth {Lots 5}}}

% 18.6
{Browse 6#{Lenkth {Lots 15}}}

% 18.9
fun {AddAtEnd L}
   if {Kdr L} == nil
      then {KonsC {Kar L} {KonsC egg nil}}
      else {KonsC {Kar L} {AddAtEnd {Kdr L}}}
   end
end

% 18.13
_ = {SetKounter 0}
{Browse 13#{AddAtEnd {Lots 3}}}

% 18.14
{Browse 14#{Kounter}}

% 18.16
fun {AddAtEndToo L}
   proc {A Ls}
      if {Kdr Ls} == nil
         then {SetKdr Ls {KonsC egg nil}}
         else {A {Kdr Ls}}
      end
   end
in
   {A L}
   L
end
proc {SetKdr C N}
   {C fun {$ A D} D end} := N
end

% 18.18
{Browse 18#{SetKounter 0}}

% 18.19
{Browse 19#{Kounter}}

% 19.20
{Browse 20#{AddAtEndToo {Lots 3}}}

% 19.22
{Browse 22#{Kounter}}

% 18.25
fun {Bons BKar}
   A = {NewCell BKar}
   D = {NewCell nil}
in
   fun {$ Selector}
      {Selector proc {$ X} D := X end A D}
   end
end
fun {BKar C}
   {C fun {$ S A D} @A end}
end
fun {BKdr C}
   {C fun {$ S A D} @D end}
end

% 19.27
local E in
   E = egg
   {Browse 27#{Bons E}}
end

% 19.30
proc {SetBKdr C X}
   {{C fun {$ S A D} S end} X}
end

% 19.32
fun {BKons A D}
   C = {Bons A}
in
   {SetBKdr C D}
   C
end

_ = {SetKounter 0}

% 18.36
Dozen = {Lots 12}

% 18.37
{Browse 37#{Kounter}}

% 18.38
BakersDozen = {AddAtEnd Dozen}

% 18.40
{Browse 40#{Kounter}}

% 18.41
BakersDozenToo = {AddAtEndToo Dozen}

% 18.43
{Browse 43#{Kounter}}

% 18.46
BakersDozenAgain = {AddAtEnd Dozen}

% 18.49
{Browse 49#{Kounter}}

% 18.53
fun {EkList Ls1 Ls2}
   if Ls1 == nil
      then Ls2 == nil
      else
         if Ls2 == nil
            then false
            else {Kar Ls1} == {Kar Ls2} andthen {EkList {Kdr Ls1} {Kdr Ls2}}
         end
   end
end
{Browse 53#{EkList BakersDozen BakersDozenToo}}

% 18.60
fun {IsSame C1 C2}
   T1 = {Kdr C1}
   T2 = {Kdr C2}
   V
in
   {SetKdr C1 1}
   {SetKdr C2 2}
   V = {Kdr C1} == {Kdr C2}
   {SetKdr C1 T1}
   {SetKdr C2 T2}
   V
end
% Note: I think the books answer is wrong here
{Browse 60#{IsSame BakersDozen BakersDozenToo}}

% 18.64
{Browse 64#{IsSame {Kons egg nil} {Kons egg nil}}}

% 18.67
fun {LastKons Ls}
   if {Kdr Ls} == nil
      then Ls
      else {LastKons {Kdr Ls}}
   end
end

% 18.68
Long = {Lots 12}

% 18.70
{SetKdr {LastKons Long} Long}
{Browse 70#Long}

% 18.71
% {Browse 71#{Lenkth Long}}

% 18.72
% {SetKdr {LastKons Long} {Kdr {Kdr Long}}}

% 18.81
fun {FiniteLenkth P}
   fun {C P Q}
      if {IsSame P Q}
         then raise infinite end
         elseif Q == nil then 0
         elseif {Kdr Q} == nil then 1
         else {C {SL P} {QK Q}} + 2
      end
   end
   fun {QK X} {Kdr {Kdr X}} end
   fun {SL X} {Kdr X} end
in
   if P == nil
      then  0
      else {Add1 {C P {Kdr P}}}
   end
end

% 18.82
Mongo = {Kons pie {Kons à {Kons la {Kons mode nil}}}}

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