#:g1: net.morilib.linguaの紹介

Posted 2014-06-30 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の182日目です。

net.morilib.linguaとはなにか

 net.morilib.linguaは、Yuichiro Moriguchi氏作のScheme処理系であるSchluesselに標準添付の言語学系のライブラリです。

パッケージ情報

インストール方法

 Schluesselの処理系をインストールすれば、起動時から使えます。

試してみる

 Schluesselは Java SE 6.0以上のJREで動作することを目的としたR5RS準拠のSchemeのインタプリタということですが、このライブラリもJavaで書かれていてJavaからも利用が簡単そうです。

数詞

 古くはMacLISPのFORMATからローマ数字の表記が標準サポートだったりするLISP界隈ですが、net.morilib.linguaでは、英、仏、独、ラテン、ギリシャ等に対応しています。

(for-each (lambda (s) 
            (let ((f (eval s (interaction-environment))))
              (list s 3999 '=> (f 3999) 9999 '=> (f 9999))
              (format #t "~A:~% ~D => ~S~% ~D => ~S~%" s 3999 (f 3999) 9999 (f 9999))))
          '(number->english-numeral
            number->french-numeral
            number->german-numeral
            number->roman-numeral
            number->big-roman-numeral
            number->ionian-numeral
            number->latin-numeral))
;>> number->english-numeral:
;>>  3999 => "three thousand nine hundred ninety-nine"
;>>  9999 => "nine thousand nine hundred ninety-nine"
;>> number->french-numeral:
;>>  3999 => "trois mille neuf cent quatre-vingt-dix-neuf"
;>>  9999 => "neuf mille neuf cent quatre-vingt-dix-neuf"
;>> number->german-numeral:
;>>  3999 => "dreitausendneunhundertneunundneunzig"
;>>  9999 => "neuntausendneunhundertneunundneunzig"
;>> number->roman-numeral:
;>>  3999 => "MMMCMXCIX"
;>>  9999 => #f
;>> number->big-roman-numeral:
;>>  3999 => "CIↃCIↃCIↃↃCCCCXCIX"
;>>  9999 => "IↃↃCIↃCIↃCIↃCIↃↃCCCCXCIX"
;>> number->ionian-numeral:
;>>  3999 => ",γϡϙθ'"
;>>  9999 => ",θϡϙθ'"
;>> number->latin-numeral:
;>>  3999 => "tria milia nongenta nonaginta novem"
;>>  9999 => "novem milia nongenta nonaginta novem"
;=> #<undef>

以前、Racketのroman.pltを紹介した時に、3999までしかサポートしていないことについては、4000からASCIIで表現できないからではないかとの指摘をshiroさんからコメントで頂いたことがありました。

この辺りもnet.morilib.linguaでは、big-roman-numeral->number、number->big-roman-numeralでサポートしています。(表示には色々な方式がありますが、CIↃを千として並べる方式のようです。)

(english-numeral->number "three thousand nine hundred ninety-nine")
;=> 3999

(roman-numeral->number "MMMCMXCIX") ;=> 3999

(big-roman-numeral->number "IↃↃCIↃCIↃCIↃCIↃↃCCCCXCIX") ;=> 9999

(number->big-roman-numeral 4000) ;=> "CIↃCIↃCIↃCIↃ"

複数形

 複数形関係のユーティリティもあります。
現在のところ英語のみの様子。
Javaのソースを眺めてみましたが、不規則変化の複数形は150位並んでいるので結構対応している方ではないでしょうか。

(english-word->plural "ox")
;=> "oxen"

(english-word->plural "formula") ;=> "formulae"

(english-plural? "ox" "oxen") ;=> #t

日本語ユーティリティ

 ローマ字<=>仮名で変換するものですが、訓令式等をオプションで指定することができます。

(kana->romaji "おはよー!、にっぽん")
;=> "ohayo!,nippon"

(kana->romaji "おはよー!、にっぽん" 'oh) ;=> "ohayoh!,nippon"

(kana->romaji "わたしのなまえは、おおのです" 'oh) ;=> "watashinonamaeha,ohnodesu"

(romaji->katakana "toukyou tokkyo kyoka kyoku") ;=> "トウキョウ トッキョ キョカ キョク"

ラテン語ユーティリティ

 ラテン語のスペルを正規化したり、比較したりするユーティリティもあります。
動かしてみた感じですが、どうもまだ作り掛けかもしれません。

(normalize-classic-latin "Gaius Julius Cæsar")
;=> "GAIVS IVLIVS CÆSAR"

(latin-string=? "Gaius Julius Cæsar" "GAIVS IVLIVS CÆSAR") ;=> #t

まとめ

 今回は、net.morilib.linguaを紹介してみました。
他の処理系があまりやらなそうなことをやっている感じのSchluesselですが、net.morilib.linguaはその辺りが反映されているユーティリティかなと思います。

comments powered by Disqus