expl3の展開についての質問

expl3の展開についての質問

- 西村 一輝 の投稿
返信数: 3

いつもお世話になっております。

毎度質問で申し訳ないのですが、expl3において以下のようなカンマ(,)でループするコードを書いた時に、上手くいかずどのようにすれば良いか教えてもらえないでしょうか。

\ExplSyntaxOn
\NewDocumentCommand {\foo } { m }{
\seq_set_split:Nnn \l_tmpa_seq {,} {#1}%カンマで分割し\l_tmpa_seqに格納
\bool_do_until:nn {\seq_if_empty_p:N \l_tmpa_seq} {%\l_tmpa_seqでループ
\seq_pop:NN \l_tmpa_seq \l_tmpa_tl%1つpopする。
\l_tmpa_tl%最初は1 次は2
\tl_put_right:Nn \l_tmpb_tl { | \tl_to_str:V \l_tmpa_tl}%\l_tmpb_tlに処理結果を追加していく。
}
\tl_use:N \l_tmpb_tl % 12|2|2 となってしまうが12|1|2としたい。
}
\ExplSyntaxOff
\foo{1,2}

実行すると出力は12|2|2が出力されるのですが12|1|2となるようコードを修正したいです。

\tl_to_str:xとしても未定義でエラーとなります。

よろしくお願いします。

タグ:
西村 一輝 への返信

Re: expl3の展開についての質問

- 西村 一輝 の投稿
仮に以下のようにすれば12とできるのですが、最初に示したループの形で同じことをしたいです。

\ExplSyntaxOn
\NewDocumentCommand {\foo } { m }{
\seq_set_split:Nnn \l_tmpa_seq {,} {#1}
\seq_map_inline:Nn \l_tmpa_seq {
\tl_put_right:Nn \l_tmpa_tl { ##1 }
}
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\foo{1,2}
西村 一輝 への返信

Re: expl3の展開についての質問

- 本田 知亮 の投稿
展開してないからです

> \tl_put_right:Nn \l_tmpb_tl { | \tl_to_str:V \l_tmpa_tl}%\l_tmpb_tlに処理結果を追加していく。

ではなく

\tl_put_right:Ne \l_tmpb_tl { | \tl_to_str:V \l_tmpa_tl}%\l_tmpb_tlに処理結果を追加していく。

とか

\tl_put_right:Nx \l_tmpb_tl { | \tl_to_str:V \l_tmpa_tl}%\l_tmpb_tlに処理結果を追加していく。

で,期待の動作になると思います.

#\fooの引数には(完全)展開可能なものしかないという前提で.

もとのものだと
\l_tmpb_tl の中身は,
| \tl_to_str:V \l_tmpa_tl | \tl_to_str:V \l_tmpa_tl
になって
\tl_use:N \l_tmpb_tl
のときに,\l_tmpa_tl の中身は2だから,|2|2 になります.
ちなみに
\l_tmpb_tl の先頭には 12 は入ってません.
\seq_pop:NN の次の行で \l_tmpa_tl があるので,そこから1と2が出てきています.