为什么当我尝试定义控制序列时会收到控制序列未定义的错误?
! Undefined control sequence. <argument> * \cs_set:Nn \obj_this:n {\prop_item:Nn \l_tmpa_prop {##1}}\obj_t...
\nonstopmode \input expl3-generic \relax \ExplSyntaxOn % -*- expl3 -*-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cs_new:Nn \obj_method:nnn
{
\cs_new:cn { #1_#2 }
{
\cs_set:Nn \obj_this:n
{ \prop_item:Nn ##1 {####1} }
#3
}
}
\prop_put:Nnn \l_tmpa_prop { key } { value }
\obj_method:nnn { sean } { get:Nn }
{ \obj_this:n {#2} }
\exp_args:No \msg_term:n { \sean_get:Nn \l_tmpa_prop { key } }
\bye
日志
*************************************************
! Undefined control sequence.
<argument> * \cs_set:Nn \obj_this:n
{\prop_item:Nn \l_tmpa_prop {##1}}\obj_t...
\__iow_wrap_set:Nx #1#2->\cs_set_nopar:Npx #1{#2
}
\iow_wrap:nnnN ...wrap_set:Nx \l__iow_wrap_tl {#1}
\tl_set:Nx \l__iow_newline...
\msg_term:n ..._wrap:nnnN {* #1}{* }{}\iow_term:n
\iow_term:n {*************...
l.20 ...rm:n { \sean_get:Nn \l_tmpa_prop { key } }
! Undefined control sequence.
<argument> ...m:Nn \l_tmpa_prop {##1}}\obj_this:n
{key}
\__iow_wrap_set:Nx #1#2->\cs_set_nopar:Npx #1{#2
}
\iow_wrap:nnnN ...wrap_set:Nx \l__iow_wrap_tl {#1}
\tl_set:Nx \l__iow_newline...
\msg_term:n ..._wrap:nnnN {* #1}{* }{}\iow_term:n
\iow_term:n {*************...
l.20 ...rm:n { \sean_get:Nn \l_tmpa_prop { key } }
* \cs_set:Nn {}{key}
*************************************************
答案1
如果你注释掉
\exp_args:No \msg_term:n { \sean_get:Nn \l_tmpa_prop { key } }
你会发现错误不是来自定义,而是来自参数\msg_term:n
不完全可扩展的事实。如果你将该行更改为
\exp_args:No \tl_show:n { \sean_get:Nn \l_tmpa_prop { key } }
你得到:
> \cs_set:Nn \obj_this:n {\prop_item:Nn \l_tmpa_prop {##1}}\obj_this:n {key}
这就是错误产生的地方。
-expansiono
的字面意思是“扩展一次”,在多标记参数的上下文中,它仅指第一个标记。简而言之,它在这里不起作用:)
如果你只是跑步
\sean_get:Nn \l_tmpa_prop { key }
它确实会排版value
,但是如果不在代码中做更多分配,您就无法直接访问它;例如:
\cs_new:Nn \obj_method:nnn
{
\cs_new:cn { #1_#2 }
{
\cs_set:Nn \obj_this:n
{ \prop_get:NnN ##1 {####1} ##3 }
#3
}
}
\prop_put:Nnn \l_tmpa_prop { key } { value }
\obj_method:nnn { sean } { get:NnN } { \obj_this:n {#2} }
\sean_get:NnN \l_tmpa_prop { key } \l_tmpa_tl
\tl_show:N \l_tmpa_tl
但我不知道这对于您预期的应用是否有意义!