2007-01-01から1年間の記事一覧
textfile.org経由で,小島さんの話題.小島寛之さんというと私には,SEGの中学数学のリーダーというイメージです.中学校のユークリッド幾何と「原論的ユークリッド幾何」の橋渡しになるような問題提起的な問題や「ロバの橋」を真正面から扱ったテキストは面…
前回書いた件の続き.要はJIS78のCmapの代わりにJIS2004のCmapを使えばよいだけです.全くパラレルに準備すればよいだけです.とりあえず,サンプルのマクロとソースを晒しておきます.要は必要なところだけ「フォント切り換え」してしまい,出力機側のCmap…
ttkさんによる JISX0213-2004-H/V を使えば map さえ書けばJIS2004のグリフを出せます.要整理
準備とdvips+Distiller TeXは文字の字形には関与しません.したがって,例えば「葛」などはXPでは「ヒ」のタイプ,Vistaでは「人」のタイプになります.ところが,JIS2004文字には古い78年のJISに字形を戻しているものが結構あります(どれくらいあるかは個…
頼むから変なマクロを使うな.バグだらけのマクロを解析して「適切に動くように修正」するのはゼロから構築するよりも,難解かつ疲労する作業なのだ.自分でできないなら,美文書のような書籍を読んで「標準的」なことのみを行って,できないところは「こう…
馬車馬のように働いてた.すっかりHaskellとも縁遠くなった.存在証明で更新してみる(苦笑)
sepBy1を使うことで「英語の文」を単語のリストに分解するパーサをsentenceを作ります. word:: Parser String word = many1 (letter <|> digit) sentence:: Parser [String] sentence = do words <- sepBy1 word separator oneOf ".?!" return words separa…
many/many1はパースしたものを返しますが,パースしたものを返さないskipMany/skipMany1というパーサコンビネータも用意されています. skipMany :: GenParser tok st a -> GenParser tok st () skipMany1 :: GenParser tok st a -> GenParser tok st () |ha…
「単語」をパースするパーサwordを考えてみます.ここで「単語」というのは一つ以上の「大文字・小文字のアルファベット」から構成されます. word:: Parser String word = do { c <- letter ; do { cs <- word; return (c:cs) ;} <|> return [c]; } do記法…
前に,ライブラリのソースコードの所在が分からないと書きました.たしかにGHCをインストールすると見当たらないのですが,GHCそのもののソースコードには入ってるのではなかろうかと思い至り(遅い(^^;;),GHC6.6.1のソースコードを入手,解凍してみました…
ただパーサを書いて何をパースしたか出力するだけでは意味がないので,意味のあるものを返そうというお話.前に作ったparens parens::Parser () parens = do char '(' >> parens >> char ')' parens <|> return () を書き直して,括弧が何重になってるかを数…
Parsecの選択 は「predictive」だとのこと.predictive,予言的.最初のパーサが入力を一切消費しないときのみ,次のパーサに処理が進むということらしいです. testOr::Parser String testOr = string "(a)" <|> string "(b)" というのを作ってみると *Main…
パーサをつなげてみようというお話.Parserはモナドだからdo記法でつなげることができます. openClose:: Parser Char openClose = do char '(' char ')' これで () だけをパースするパーサになるわけですか. *Main> parseTest openClose "()" ')' *Main> p…
teTeXがobsoluteになって久しく,texliveが次期標準になりつつありますが,ついに土村さんがptetexの後継としてptexliveを公開されました.試すのは週末になりそうです.それにしても暑くてばてばてです。。。
``Parsec, a fast combinator parser''をきちんと読んでみます.関係ないですけど,このドキュメント,誰がどうみてもLaTeX2e組で,PDFはdvipdfmで生成されてますね.閑話休題. 入力したソースは全部p.hsに保存することにして,ghciで実行します. ___ ___ …
Haskell本,それも日本人による日本語の本の三冊目以降が出ませんね.Haskellの「尖がった」ところが前面にでるような本が出てくれると勉強になるのですが.とりあえず現在頑張ってParsecのドキュメント読み中. ParsecでRPNからASTを作る なんてくらいのこ…
TeXのマクロの基本は\defなのですが,TeXのマクロは「単なる文字列の置き換えに過ぎない」という根本的な大原則があります.この原則を踏まえないでTeXのマクロを作ろうとすると絶対にいつかしっぺ返しをくらいます.例えば \def\temp{太郎} \def\marcoA#1{\…
TeXでマクロを定義するには\defを使います.しかし,この\defはスコープ(TeXではグループと呼ばれる)に影響されるので,同じスコープ内でのみ有効です.これを問答無用でグローバルにするための修飾子が\globalです.TeXのマクロは「動的スコープ」を持つ…
「ふつける」でソースは省略されているexpandPatternを,ちょっと前に練習がてら自前で実装したんですが。。。今見るとまるで分からない(-_-;;。だめだめ。parsecは忘れてるわ,そもそも自分が作った中間処理の関数が何をしてるのかが不明.コメントは冗長す…
リストの連結で,同じリストを連結させようとすると循環することに気がつきました.ということで,複製処理を追加です.さらに第一引数のリストを破壊してしまうことにも気がついたので修正です. sub Lconcat{ my $a=shift; my $b=shift; $b=Lduplicate($a)…
とにかく暑い・・セミは夜中まで元気.ふさふさおけけで散歩してるワンコも暑そうです.そんな中カレーを作ってたらますます暑くなった(苦笑).
sub Llength{#長さ my $l=shift; my $len=0; return 0 unless Lhead($l); return Llength(Ltail($l))+1; } sub Lduplicate{#複製 my $l=shift; return [Lhead($l),undef] unless Ltail($l); return [Lhead($l),Lduplicate(Ltail($l))]; } sub Llast{#最後の…
TeXにおいて分かりにくいものにマークの概念があります.マークの詳細には触れませんが,柱などに「何章」とか「何節」という本文の場所を示すものを出力するための機構だというくらいの理解でとりあえずは問題ないです.もっとも,以下の内容はマークという…
Lmap/filterの第一引数には sub を省略した無名サブルーチンを使えますが,そのサブルーチンの引数は一個で,$_[0] を使います.一方,Perlの組み込みのmap/grepでは,デフォルトの $_ を使います.そこで,Lmap/filterでも同じように $_ に変更してみます.…
mapの次はgrep.名前をfilterにします. sub filter(&$){ my ($f,$l) = @_; return unless $l; my $temp=head($l); if ($f->($temp)){ node($temp, &filter($f,tail($l))); }else{ &filter($f,tail($l)); } } filterはリンクトリストのノードを一個一個たど…
sub Lmap(&$){ my ($f, $l) = @_; return unless $l; node ($f->(head($l)), Lmap($f, tail($l)) ); } listのmapということで,Lmapとしました.Higher-Order Perlでは,transformという名前になっていますが,mapの方が短いので(^^;.これを実行してみると …
2007-07-28さんのところで発見.TeXネタ.いわゆる「半角カタカナ」*1ASCIIでいうところの128番から256番の文字はTeXでは鬼門です.日本で標準的なpTeXでは,ソースの文字コードによって SJISの場合は無視(組版には現われない) JISの場合はエラー(コンパイル…
仕事が忙しかった.疲れた.頼むから25日のPM3:00と26日のPM2:00に持ってきて,27日のPM3:00までに223ページ+53個の図版修正なんてやめてくれ.他の案件がほとんど止まってしまったではないか.カレンダをみると,ここに何か書いてる日とそうでない日が見事…
二つの有限リンクトリストを連結してみます.つまり, $list1= [ 1, [ 2, [ 3, undef] ] ]; $list2= [ 10, [20, [30, undef] ] ]; から $list = [ 1, [ 2, [ 3, [ 10, [20, [30, undef] ] ] ] ] ]; を作る操作です. sub concat{ my ($a,$b)=@_; my $c = $a;…
HOP(Higher-Order Perl)にしたがって,リンクトリスト*1を考えます.HOPでいうところのリンクトリストは,それらしく書くと以下のものです. linked_list = node node | [ head, tail ] | [ head, undef] tail = node 言葉でいうと次のどちらかが成り立つ…