マクロツイーター

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

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

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

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn  %------------------------

\seq_new:N \l_zrxx_tmpa_seq
\tl_new:N \l_zrxx_tmpa_tl
\cs_new:Nn \zrxx_sort_list:nN {
    % まずシーケンスを作成する
    \seq_set_split:Nnn \l_zrxx_tmpa_seq { / } { #1 }
    \seq_remove_all:Nn \l_zrxx_tmpa_seq { }
    % シーケンスをアイテム列に変換
    \tl_clear:N \l_zrxx_tmpa_tl
    \seq_map_inline:Nn \l_zrxx_tmpa_seq
      { \tl_put_right:Nn \l_zrxx_tmpa_tl { {##1} } }
    % \prg_quicksort 呼出; 結果は \result に書き出す
    \tl_set:Nn \result { / }
    \cs_set:Nn \prg_quicksort_function:n
      { \tl_put_right:Nn \result { ##1 / } }
    \cs_set:Npn \prg_quicksort_compare:nnTF ##1##2
      { \int_compare:nNnTF {##1} > {##2} }
    \exp_args:NV \prg_quicksort:n \l_zrxx_tmpa_tl
}

%%<*> \sortList
\tl_clear_new:N \result
\NewDocumentCommand \sortList { m } {
    \zrxx_sort_list:nN {#1} \result
}
\ExplSyntaxOff %------------------------
\begin{document}
%% テスト
\sortList{/3/1/4/1/5/9/}
\show\result %=> macro:->/1/1/3/4/5/9/
\end{document}

なお、\prg_quicksort:n は完全展開可能でない(制限付展開可能でもない)ので、これに頼っている限りは完全展開可能なソートの関数(マクロ)は作れない。

*1:l3experimental に属している str や regex は現状はまだ「標準」ではないのだが。