マクロツイーター

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

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

*「え〜!? もう終わりと言ったじゃん!」
ZR「補足ですよ!」
*「何で『補足1』なんですか? 『〜2』もあるんですか?」
ZR「まあ、ないことを祈ろう」*1

「区切り付引数の罠」は expl3 に限った話でなく、普通の TeX でも全く同じことが起こる。参考のために、前回の car/cdr の話を素の TeX に翻訳してみる。

「よくある」car/cdr の実装は次の通り。((展開結果を実際に見たい場合は、\typeout の引数に入れて実行してみよう。))

\def\xx@car#1{%
  \xx@car@a#1\xx@nil}
\def\xx@car@a#1#2\xx@nil{%
  #1}
\def\xx@cdr#1{%
  \xx@cdr@a#1\xx@nil}
\def\xx@cdr@a#1#2\xx@nil{%
  #2}
\xx@car{feel}                      %(展開)=> f
\xx@cdr{feel}                      %(展開)=> eel
\xx@car{{cei}{dei}{ghi}{ip}}       %(展開)=> cei
\xx@cdr{{cei}{dei}{ghi}{ip}}       %(展開)=> {dei}{ghi}{ip}

car はこれでよい*2が、cdr は「罠」のせいで困ったことになる。

\xx@car{{cei}{dei}}                %(展開)=> cei
\xx@cdr{{cei}{dei}}                %(展開)=> dei ; {dei} でない!

「罠」にはまらない cdr の実装。

\def\xx@cdrx#1{%
  \expandafter\expandafter\expandafter\@firstofone
   {\expandafter\@gobble#1}}
\xx@cdrx{{cei}{dei}}               %(展開)=> {dei}

*1:補足2の予定は本当にない。今は。

*2:car の結果は常に 1 つのアイテムだから括弧が外れる動作で一貫している。だから、「その仕様を正とするならそれでよい」ということ。