A Data and Code Fragments

This appendix contains code fragments left out in the text's chapters.

A.1 Application Development

<Body for DB.oz>=
define 
   Data = {Dictionary.new}
   Ctr  = {New class $ 
                  prop locking
                  attr i:0
                  meth init(I <= 0)
                     lock i <- I end 
                  end 
                  meth get($)
                     lock @end 
                  end 
                  meth inc($)
                     lock I=@i+in i <- I I end 
                  end 
               end init()}
    
   proc {Add X}
      I={Ctr inc($)}
   in 
      {Dictionary.put Data I X}
   end 
       
   fun {Get ID}
      {Dictionary.get Data ID}
   end 
 
   fun {GetAll}
      {Map {Dictionary.keys Data}
       fun {$ K}
          {AdjoinAt {Dictionary.get Data K} key K}
       end}
   end 
    
   proc {Remove ID}
      {Dictionary.remove Data ID}
   end

<Implementation of Book>=
T ={New Tk.toplevel tkInit}
      F1={New Tk.frame    tkInit(parent:T relief:sunken bd:2)}
      V ={New Tk.variable tkInit(Fs.1.key)}
      {Tk.batch (grid(b({Map ['' 'From' 'To' 'Price']
                         fun {$ A}
                            {New Tk.label tkInit(parent:F1 text:A
                                                 relief:raised bd:1)}
                         end})
                      padx:1 pady:1 sticky:ew) | 
                 {Map Fs
                  fun {$ F}
                     grid({New Tk.radiobutton tkInit(parent:F1 var:V
                                                     value:F.key)}
                          b({Map ['from' to price]
                             fun {$ A}
                                {New Tk.label tkInit(parent:F1 text:F.A)}
                             end}))
                  end})}
      F2={New Tk.frame tkInit(parent:T)}
      [FN LN EM] =
      {Map ['First name' 'Last name' 'E-Mail']
       fun {$ S}
          E={New Tk.entry tkInit(parent:F2 width:20 bg:wheat)}
       in 
          {Tk.send grid({New Tk.label tkInit(parent:F2 text:S#':' anchor:w)} E
                        sticky:ew)}
          fun {$}
             {E tkReturnAtom(get $)}
          end 
       end}
      B={New Tk.button tkInit(parent:T text:'Okay' 
                              action:
                                 proc {$}
                                    Get=form(first:{FN} last:{LN} email:{EM}
                                             key:{V tkReturnInt($)})
                                    {T tkClose}
                                 end)}
   in 
      {Tk.send pack(F1 F2 B padx:1#m pady:2#m)}

<Sample flights>=
[f('from':'Paris'       to:'Stockholm'   price:234)
 f('from':'Saarbrücken' to:'Paris'       price:345)
 f('from':'New York'    to:'Saarbrücken' price:567)
 f('from':'New York'    to:'Bruxelles'   price:363)
 f('from':'Paris'       to:'Saarbrücken' price:834)
 f('from':'Stockholm'   to:'Bruxelles'   price:333)
 f('from':'London'      to:'Saarbrücken' price:523)
 f('from':'Saarbrücken' to:'London'      price:457)
 f('from':'Bruxelles'   to:'New York'    price:324)
 f('from':'Boston'      to:'Stockholm'   price:765)
 f('from':'Stockholm'   to:'New York'    price:344)
 f('from':'Sydney'      to:'Saarbrücken' price:3452)
 f('from':'Sydney'      to:'Stockholm'   price:2568)]


Denys Duchier, Leif Kornstaedt and Christian Schulte
Version 1.0.1 (19990218)