あべのりさんの「酷い \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
は完全展開可能でない(制限付展開可能でもない)ので、これに頼っている限りは完全展開可能なソートの関数(マクロ)は作れない。