定义时未定义控制序列

定义时未定义控制序列

为什么当我尝试定义控制序列时会收到控制序列未定义的错误?

! 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

但我不知道这对于您预期的应用是否有意义!

相关内容