gymel  | Beispiele  | Soundex

Parameterbeispiel: Soundex-Algorithmus

Bitte auch meinen Vortrag beim 1. Avanti Workshop 1997 in Bonn beachten!

Der Soundex-Algorithmus von Knuth ist ziemlich trivial (und schlecht, und funktioniert eigentlich nur für Englisch). Allerdings ist er so trivial, daß er sich rein mit Mitteln der Exportparametrierung umsetzen läßt.

Das folgende Beispiel ist keine direkte Umsetzung etwa des Perl-Moduls Text::Soundex, sondern etwas optimiert:

Hier der Code

  % Soundex-Algorithmus mittels Allegro-Parameterdatei
  % Autor: Thomas Berger
  % This code is in the public domain
  % Problem: Buchstabenweise Schleife!

  % #ucg darf nicht belegt sein!

  % #u1:  Ausgangswort
  % #ucg: Ergebnis
  % #ucd: Zwischenspeichern des Buchstaben-Aequivalents
  % #uce: Merker fuer letzten Wert
  % #ucf: Merker fuer 1. Buchstaben

    $_ = uc $_;
  % Optimierung: Nur eine Sprungmarke benutzen!
#-${marke}
#ucg +#98y Z            % Wiedereinsprung?

                        % Init
#u1 dcc dcg y1 f"0123456789[]<>" acc

      tr/A-Z//cd;
      ($f) = /^(.)/;
#ucc +#98x dcd dcf e1 acg
#+#                              % Rausgefallen
      tr/AEHIOUWYBFPVCGJKQSXZDTLMNR/00000000111122222222334556/;

#98y
#ucf +#98y ,"_0__" b4 Z         % Abkuerzung: genug eingesammelt!
#ucc +#98x dcc b1 acc
#nr +#98y Z

#98x
#ucc +#98z e1 c"[AEHIOUWY]" p"0" acd
#ucc +#98z e1 c"[BFPV]" p"1" acd
#ucc +#98z e1 c"[CGJKQSXZ]" p"2" acd
#ucc +#98z e1 c"[DT]" p"3" acd
#ucc +#98z e1 c"[L]" p"4" acd
#ucc +#98z e1 c"[MN]" p"5" acd
#ucc +#98z e1 c"[R]" p"6" acd
#nr +${marke} Z        % Sonderzeichen auslassen
   % evtl. verwerfen bei Doppelung
#98z
#ucd dcd e1 =ce+${marke} Z        % Zeichen zusammenschieben
#uce +${marke} Acf                % 1. verschiedenes jeweils anhaengen

#98y
      ($fc) = /^(.)/;
      s/^$fc+//;
      tr///cs;
#ucf i4,0 p"!" dcf acf            % "i4" ggfls. anpassen, falls nicht A.CFG
#ucf +#98w ,"_0__" P"0000" b1 e3 Acg
#nr p"000" e3 Acg
#98w
#nr dce dcf Z

 #)x
#ucg +#98z dcg p{"|${sndreg}"} P{":"}
#+#
#98z
!u1
#+#

(Die Angelegenheit läßt sich auch leicht in eine Unterprogramm-Lösung umwandeln)


Letzte Aktualisierung: 03.01.2001
submit bugs here