go => Names = split("Lloyd Woolcock Donnell Baragwanath Williams Ashcroft Ashcraft Euler Ellery Gauss Ghosh Hilbert Heilbronn Knuth Kant Ladd Lukasiewicz Lissajous O'Hara"), SoundexNames = split("L300 W422 D540 B625 W452 A261 A261 E460 E460 G200 G200 H416 H416 K530 K530 L300 L222 L222 O600"), foreach({Name,Correct} in zip(Names, SoundexNames)) S = soundex(Name), printf("%s: %s ",Name,S), if S == Correct then println("ok") else printf("not correct! Should be: %s\n", Correct) end end, nl. soundex("", _) = "" => true. soundex(Word) = Soundex => SoundexAlphabet = "0123012#02245501262301#202", Soundex = "", LastC = '?', foreach(Ch in Word.to_uppercase, C = ord(Ch), C >= 0'A', C <= 0'Z', Soundex.len < 4) ThisC := SoundexAlphabet[C-0'A'+1], Skip = false, % to handle '#' if Soundex.len == 0 then Soundex := Soundex ++ [Ch] elseif ThisC == '#' then Skip := true elseif ThisC != '0', ThisC != LastC then Soundex := Soundex ++ [ThisC] end, if Skip == false then LastC := ThisC end end, Soundex := Soundex.padRight(4,'0'). padRight(S,Len,PadChar) = S ++ [PadChar : _ in 1..Len-S.len].