関数型!イカ娘

(この記事は partake.in の為に書かれました。TeX マクロ初心者なので識者の皆様方のツッコミ等歓迎します。)

奥村先生まで侵略されてるじゃなイカ

フッフッフッ、むこうから侵略されに来るとは好都合でゲソ!ついでに日本の TeX 界もいっしょに侵略してやるでゲソ!

関数作らなイカ

まずは関数*1の定義でゲソ。関数を定義するには \def を使うでゲソ。

\def\incursion#1#2{#1#2 が侵略したでゲソ!}

\incursion{海の家 れもん}{イカ娘}
\end

これに適当な名前を付けて保存して、pTeX に掛ければ DVI が完成するでゲソ。これは素の TeX なので pLaTeX じゃなくて pTeX を使うでゲソ。

海の家 れもん を イカ娘 が侵略したでゲソ

と出力されていたら成功でゲソ。簡単じゃなイカ

再帰しなイカ

\newcount\cnt
\def\ika#1{
  \cnt = #1
  \advance \cnt by -1
  \ifnum#1 = 0
    イカ娘!
  \else
    侵略!\expandafter\ika\number\cnt
  \fi
}

\ika{6}

\newcount<名前> でカウンタを定義、<名前> = <数> で代入できるでゲソ。足し算は \advance <名前> by <数>、値は \number を使えば参照できるんじゃなイカ? \ifnum は if 文の仲間で \ifnum<名前1><演算子><名前2> とすれば数値を比較できるでゲソ。

ところで、ここに出てくる \expandafter ってなんでゲソ?試しに外してみるでゲソ!

\newcount\cnt
\def\ika#1{
  \cnt = #1
  \advance \cnt by -1
  \ifnum#1 = 0
    イカ娘!
  \else
    侵略!\ika{\number\cnt}
  \fi
}

\ika{6}
\end

出力結果は…

侵略!侵略!侵略!侵略!侵略!イカ娘

一回分足りないでゲソ!!

\expandafter が無いと、\ika{\number\cnt} の展開結果は

  \cnt = \number\cnt
  \advance \cnt by -1
  \ifnum\number\cnt = 0
    イカ娘!
  \else
    侵略!\ika{\number\cnt}
  \fi

になるでゲソ。#1 の部分が \number\cnt になってるじゃイカ? \ika を展開する前に \number\cnt を展開したいでゲソ……。そんな時は \expandafter を付けてみるでゲソ!

\expandafter\ika{\number\cnt}

これじゃダメでゲソ。\expandafter は \ika を読み飛ばして次のトークンを評価するでゲソ。\ika の次のトークンは { なので \ika を飛ばして { を評価して \ika に戻ってくるだけなので最初と同じでゲソ。
正しくはこうやるでゲソ!

\expandafter\ika\number\cnt

これなら、 \ika を飛ばして \number を評価、\number は引数を要求して \number\cnt が評価された後 \ika{評価済みの\number\cnt} になるでゲソ*2

…… \ika をムシするとは良い度胸じゃなイカ!?

高階関数にしてみなイカ

さっきの \ika{6} の代わりに高階関数を使ってみるでゲソ!

\def\hoge#1{%
  #1{6}
}

\hoge{\ika}

簡単じゃなイカ

*1:本当の名前はマクロでゲソ……。私の天敵のマグロみたいで恐ろしいので名前を変えてやったでゲソ!

*2: http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=58&parent=317