123456789101112131415161718192021222324252627282930313233343536373839404142434445[@@@warning"-32"]typeencoding=ISO_8859_1|ISO_8859_2|KOI8_R|UTF_8letinvalid_argffmt=Format.kasprintfinvalid_argfmtletencoding_to_string=function|ISO_8859_1->"ISO_8859_1"|ISO_8859_2->"ISO_8859_2"|KOI8_R->"KOI8_R"|UTF_8->"UTF_8"letpp_encodingppfv=Format.pp_print_stringppf(encoding_to_stringv)typetexceptionStem_internal_errorofstringlet_=Callback.register_exception"stem exception"(Stem_internal_error"")moduleC=structexternallist:unit->stringlist="stem_list"externalstem_new:string->string->t="stem_new"externalstem_delete:t->unit="stem_delete"externalstem:t->string->string="stem"endmoduleLanguage=structtypet=stringletpp=Format.pp_print_stringendletlanguages=C.list()letporter=List.find((=)"porter")languagesletcreate?(encoding=UTF_8)alg=letencoding=encoding_to_stringencodinginC.stem_newalgencodingletremove=C.stem_deleteletstemtword=tryC.stemtwordwith_->invalid_argf"%S is an invalid word to stem"word