But. Both this version & pg's one are actually buggy. Obvious example:
arc> (correct "yellow")
"fellow"
Canonical version gives the expected answer, "yellow". So I'd say, no, these are not correct implementations (the Perl version seems to always give the same results than the Arc one).
A thing I have remarked is that the list returned by 'edits{1|2} contains the original value (i.e: (find "python" (edits1 "python")) is t), where this is not the behaviour of Norvig's version. (That's also why the loop in my correct() isn't (for ($win, &edits1($win), &edits2($win)), in contrary to the Arc one).
And this may be incorrect. Or maybe, if $win/word is in nwords, 'correct should stop (immediately). This would - at least - correct the "yellow" -> "fellow" problem.
This is, however, not the only issue. Norvig's version and these versions, given the same "big.txt", don't give the same correction for other words (try "speling", "godd"). And I strongly suppose that Norvig's version is the most correct.
(def known (words) (dedup:keep [nwords _] words)) ; lines count is now 12
(def correct2 (word (o f [nwords _]))
(most f
(or (known:list word) (known:edits1 word) (known:edits2 word) (list word))))
Or:
(def correct3 (word (o f [nwords _])) ; don't need 'known, but require aspirin
(most f (or ((apply orf (map [fn (w) (dedup:keep [nwords _] (_ w))]
(list list edits1 edits2)))
word) (list word))))
arc> (correct{2/3} "yellow")
yellow
arc> (correct{2/3} "godd")
good
arc> (correct{2/3} "speling")
spelling
arc> (correct{2/3} "unnkknnoown")
unnkknnoown
Not exactly the same results than Norvig's version (>>> correct("speling") -> "sling" / "godd" -> "god") but I tested the Ruby version linked on his site, and it yields the same results. Note that the result for "speling" is not really good in canonical version. Maybe it's because the order on Python sets is different from the one in Ruby/Arc lists. I should port the test program of Norvig to stop worrying, but it's OK for now. For now, let's say this version is better than the Norvig's one (!!!)