variable willi ( Personendaten ) ," 12.5.1954" ," Onkel Willi" ," Wilhelm Lange" ," Am Brotsteig 5" ," 18200 Bratstett" : daten ( anz addr --- addr ) 2 + ( Variable überspringen) swap begin dup 0> ( Anzahl >0? ) while ( wenn ja ) 1 - ( Anzahl = Anzahl -1 ) swap dup c@ ( Länge des aktuellen Strings holen ) + 1 + swap ( Auf nächstes Zählbyte setzen ) repeat drop ; ( Anzahl löschen ) create monate 1 , 32 , 60, 91 , 121 , 152 , 182 , 213 , 243 , 274 , 304 , 335 , : tagesnummer ( tag monat --- tagesnummer) 1 - ( Korrektur, weil mit 0 beginnend ) 2 * monate + @ ( Tag des Monatsersten holen ) + ( Summe bilden ) 1 - ; ( Korrektur, weil mit 0 beginnend ) : zahlbilden( char1 char10 --- zahl) 15 and ( 1. Zahl holen ) 10 * ( Zehner bilden ) swap 15 and ( 2. Zahl holen ) + ; : tagesdatum ( addresse --- tagesnummer) dup 1+ c@ ( Zehner der Tage ) swap dup 2 + c@ ( Einer der Tage ) rot zahlbilden ( Tage bilden) swap dup 4 + c@ ( Zehner der Monate ) swap 5 + c@ ( Einer der Monate ) swap zahlbilden ( Monat bilden ) tagesnummer ; : tagesdifferenz ( adresse --- differenz) Tagesdatum Date@ ( Systemdatum holen ) drop ( Jahreszahl löschen ) Tagesnummer - ; ( Differenz bilden ) : geburtstag ( addresse --- ) dup 2 swap daten ( Spitznamen holen ) count type ( Spitznamen ausgeben ) space ." noch" 1 daten ( Geburtsdatum holen ) tagesdifferenz ( Tagesdifferenz ausrechnen ) space ." Tage" cr ; : geburtstage( --- ) willi ( 1. Eintrag) begin ( Schleifenbeginn ) dup ( Adresse doppeln ) geburtstag ( Ausgabe ) @ dup 0= ( ist die nächste Adresse NULL ?) until ; ( wenn nicht, neue Schleife )