マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

プログラミング

expl3な言語で完全展開可能な関数(マクロ)を作る件について (8)

(前回の続き) 誰得感満載のこのシリーズがいつの間にか 8 回目になってしまった。しかし、今回が最終回なので安心してほしい(謎)。 関数 \zrxxnz_tail:n ― 正しい cdr の作り方 前回で保留になっていた関数 \zrxxnz_tail:n について述べることにする。 …

expl3な言語で完全展開可能な関数(マクロ)を作る件について (7)

(前回の続き) 「展開可能のジレンマ」から抜け出す シリーズ(5)〜(6)において、「iota で生成した整数列を map に通す」というロジックを expl3 で実装しようとしたが、そうすると「完全展開可能」と「制限付展開可能」の差異のせいで全体を展開可能にする…

二分木の処理を完全展開可能にする(3)

(前回の続き) 出題の 3 つの関数の実装 前回に作った補助関数 \zrxxpz_tree_dispatch:NNn を用いて、問題で求められている 3 つの関数(\sumLeaves、\treeDepth、\sumLeavesWithin*1)を実装することにする。前回のコードと同じ部分がかなりあるが敢えて完…

二分木の処理を完全展開可能にする(2)

(前回の続き)共通部品の実装 それでは、前回に示した方針に従って、実際に \zrxxpz_do_tree:NNn を作ってみる。ただし事情があって名前は \zrxxpz_tree_dispatch:NNn に変更している。以下のコードで本質的なのは、最初の \zrxxpz_tree_dispatch:NNn (と…

二分木の処理を完全展開可能にする(1)

…つまり、2011-08-31 の記事の問題 4 を完全展開可能なように作る件について。ただし expl3 を使用して。 これを行うに際して一番難しいと思われる問題は、「それをする真っ当な理由を構築すること」であろう。これについては賢明な読者への課題として残して…

expl3な言語で完全展開可能な関数(マクロ)を作る件について (6)

展開可能性のジレンマところが、実はまだ大きな罠が残っている。それは、\exp_args:Nx 自体が展開可能でないということである。((マニュアル(interface3)を見れば判るが、他の \exp_args:N? は全て完全展開可能であるのに、\exp_args:Nx だけ制限付展開可…

expl3な言語で完全展開可能な関数(マクロ)を作る件について (5)

「関数」のような関数の実現法完全/制限付展開可能について注意すべきこととして、例え展開可能な関数であっても、それを(他の言語の「関数」のように)引数に入れて組み合わせたものは、必ずしも正しい動作にならないということである。これは、ただ「展…

expl3な言語で完全展開可能な関数(マクロ)を作る件について (4)

再びナベアツの話「TeX なんかやめて expl3 を使えば!?」の記事で \NabeAzzX の expl3 の言語での実装を掲載した。続いて本シリーズ第 1 回における補足説明の記事の最後で、\NabeAzzX の実装の中で使われている \prg_stepwise_function:nnnN は完全展開可…

expl3な言語で完全展開可能な関数(マクロ)を作る件について (3)

expl3 における「展開制御支援」このように完全展開の概念を 2 つに分ける理由は、expl3 の言語のもつ「展開制御支援」の機能にある。1 つのトークン列を引数にとる関数(マクロ)があったとする。命名規則に従えば、そのような関数の引数指定子(argument s…

expl3な言語で完全展開可能な関数(マクロ)を作る件について (2)

[追記 21:12]前にこれを書いていたこをすっかり忘れてた。なのでタイトル変更。さて、TeX 言語での「完全展開可能」の話が済んだので、expl3 についての話を始めよう。以前に述べたように、expl3 の言語では「完全展開可能」を 2 つの細分している。expl3 …

そもそも完全展開可能とは何ぞや?

expl3 における「完全展開可能」と「制限付展開可能」の違いを説明しようと思ったが、それにはまず TeX 言語における「完全展開可能」の概念についてもっとまともな「定義」を与える必要があると感じたので、ますそこから始めることにする。ただし、以下は我…

\sortList をもっと酷くする件について

あべのりさんの「酷い \sortList」をもっと酷くする、つまり標準モジュール*1の力を借りて手早く解くことを考えた。文字列形式からの変換は、l3regex まで投入して \regex_split:nnN を使えば良さそうだ。と思ったら、後で seq モジュールに \seq_set_split:…

expl3な言語で完全展開可能な関数(マクロ)を作る件について (1)

以前に(TeX 言語での)完全展開可能なナベアツ(\NabeAzzX)のところで次のようなことを述べた。マクロを完全展開可能にする場合、代入操作が全く使えなくなる。従って、(純粋な)関数型言語の方法論でプログラミングする必要がある。 完全展開でない \Nab…

expl3なプログラム言語を学習する件について

前回の記事で LaTeX3 のプログラミング用言語*1のプログラムを掲載した。この言語について興味をもった人は、是非、Joseph Wright *2氏のブログで最近連載されている「Programming LaTeX3」の一連の記事を見ることをお勧めする。ここでは、「LaTeX は知って…

TeX での「代数的データ型」の扱い (4)

(前回の続き) 前回までで「TeX で『代数的データ型』(のようなもの)を扱う、少し変態的な方法」について説明した。これを読んで「確かに使えるかも知れないが、現実の実用的なプログラミングの場面で使うことがあるのか」と疑問に思ったかも知れない。実…

TeX での「代数的データ型」の扱い (3)

(前回の続き) 前回までで、「代数的データ型の扱い」の例として「Cons 対によるリスト」を扱った。しかしやはりリストでこの表現を使うのは(TeX では)少し大袈裟な感じがすることは否めない。そこで「代数的データ型の例」としてリストの次に必ず出てく…

TeX での「代数的データ型」の扱い (2)

(前回の続き) 少し複雑な例:リストのソート 多少複雑なプログラムの例として、リストの挿入ソートを実装したものを挙げておく。(\xx@sl@do@sort がメイン。)注目すべき点として、(TeX としては)割と複雑なデータを扱っているのに、展開制御(\expanda…

TeX での「代数的データ型」の扱い (1)

または、「car/cdr と対応する cons を作る件について」。 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src…

TeX で、「ループを回して 1 文字ずつ読む」件について

bxgrassator を作っていたら、表題のような基本的な処理で躓いた、という話。 Grass の「擬似 I/O」(文書中で与えられた「入力文字列」から読み TeX コードに書き出す*1)を実装している時に、次のような処理が必要になった。*2 無引数マクロ \InputStr に…

展開可能なナベアツ(\NabeAzzX)の回答例

「完全展開可能なナベアツ」の plain TeX での実装の例。もちろん e-TeX 拡張は不要である。 \catcode`@=11 %------------------------- \newcount\nax@n \def\nax@esc@if#1\fi#2\nax@end@if{\fi#1} % \def\nax@t{}\let\nax@x=\relax \nax@n=0 \loop \expand…

TeX で「ほむほむ」したり草を生やす件について

何故か、TeX 言語(Lua でなくて)で Grass/「ほむほむ」のインタプリタを作ることがネタとして意味があることになってしまったので、作ってみた。 とにかくサンプル [test-homuhomu-1.tex]% 文字コードは UTF-8 \documentclass[a4paper]{article} \usepack…

TeX で草を生やす件について(まだ生えてません)

C>type knuth.www wwwWWWwwWWWwwWWwvwwWWwWWWwWWWWwvWWwWWWwWWWWwWWWWwvwWWwwwwwwwwwWwwwwwwwwwwwWWWWWW wwwwwwwwwwwWwwWWWWWWWWWwwwwwwwwwwwwwWwwWWwWWWWWwWWWWwWWWWWWWWWWWWWWWWWwwwWWWWWWW WWWWWWWWWWWwwwwwwwWWWWWWWWWWWWWWWWWWWwwwWWWWWWWWWWWWWWWWWWWW…

プログラミング言語「ほむほむ」について

前回に「問題がある」と言った点、それは何かというと 構文規則がよく解らない ということである。 Grassの文法と異なる点は以下のとおり。 wがほむ スペース・タブにはさまれた"ほむ"がW vは改行 元々が単なるネタであまり細部を詰める気がなかったからだと…

TeX 以外(例えば Grass)でナベアツする件について

「ちょっと草植えときますね型言語 Grass」で実装した NabeAzz のプログラム。改行を除いて 4613 バイト。 wwwWwwwWwwwvwwwWWWwwWWWWwwwWwwwWWWwvwwwWWWwwWWWWwwwWwwwWWWwWWWWWWwvwWWwWWWWwWWWW WwWwwwwwwwwwWwwwwwwwwwwwWWWWWWWwwwwwwWWWWWWWWwWWWWWWWWWWwW…

完全展開可能なナベアツ ― e-TeX の場合

(一応前回の続き) 完全展開可能ナベアツを実装しようとする場合、e-TeX 拡張のある時とない時では難しさが全然違ってくる。その理由は、e- でない TeX で完全展開可能なマクロを作る際には算術演算の機能が全く使えなくなるからである。 一般に、マクロを…

完全展開可能なナベアツ

「TeX でナベアツ」問題については、これまでに Web 上にいくつか回答が公開されている。その多くは完全な正解であるが、それは何れも「脆弱(fragile)」である。すなわち、 \edef\result{\NabeAzz{40}} \result のように一回 \edef で「展開」した後で実行…

TeX での末尾再帰 (6)

プログラミング言語において、関数(あるいはメソッド)に与える引数の数は(静的型付け言語の場合は型も)通常は関数ごとに固定されていてその関数の呼出において変わることはない。しかし例外的に、引数の個数(や型)が呼出毎に変わりうるような関数があ…

TeX での末尾再帰 (5)

これまで、「再帰」を中心として TeX における実行制御について色々と述べている。実行制御というのはプログラミング言語の知識の中で基礎を成すものであるが、TeX 言語においては、その使われ方の特殊性ゆえに、相当な TeX のコーディングの経験がある人で…

TeX での末尾再帰(4)

(前回の続き) ではどう修正すればよいだろうか。「参照渡し」になるのが悪いということで、「値渡し」にする、つまり変数(レジスタ)ではなく「その値を表すトークン列」を再帰呼出の引数に入れるという方法が考えられる。この場合、「値」は整数値だから…

TeX の末尾再帰(3)

「TeX で再帰する件」の続き。再帰は関数型プログラミングで常用される技術である。従って、Scheme、Haskell 等の関数型プログラミング言語を習得しているなら、その知識は TeX でのプログラミングでも役に立つことは確かである。ただ、TeX は「関数がない言…