Plone 为什么在填充槽外部定义的变量或定义宏元素在此元素内部不可见?

Plone 为什么在填充槽外部定义的变量或定义宏元素在此元素内部不可见?,plone,template-tal,zpt,template-metal,Plone,Template Tal,Zpt,Template Metal,为什么在填充槽或定义宏元素外部定义的变量在此元素内部不可见 无法计算带有变量a的表达式。当然b是可见的 另一方面,如果变量c在define slot的封闭元素中定义,如下图所示,则该变量可见 看起来只有在插入插槽后才会计算变量。只有在该上下文中查看宏时,TAL宏的上下文才有意义。如果正在查看包含宏的模板,则会对其进行解释,但如果正在使用宏,则不会进行解释。从某种意义上说,宏只是在运行时从包含宏的模板复制到使用宏的页面,然后进行扩展。所有名称空间都来自使用宏的模板 换一种说法:宏不是范围语

为什么在
填充槽
定义宏
元素外部定义的变量在此元素内部不可见


无法计算带有变量
a
的表达式。当然
b
是可见的

另一方面,如果变量
c
define slot
的封闭元素中定义,如下图所示,则该变量可见



看起来只有在插入插槽后才会计算变量。

只有在该上下文中查看宏时,TAL宏的上下文才有意义。如果正在查看包含宏的模板,则会对其进行解释,但如果正在使用宏,则不会进行解释。从某种意义上说,宏只是在运行时从包含宏的模板复制到使用宏的页面,然后进行扩展。所有名称空间都来自使用宏的模板

换一种说法:宏不是范围语言。如果是,您将无法从另一个模板中看到宏。TAL必须要复杂得多,你必须考虑闭包和函数

之所以称为“宏”语言,是因为宏在使用时会展开。它们不是函数


那么,为什么包含模板的宏包含上下文呢?他们不必这么做。通常这样做是为了在真实环境中测试宏。(尽管有时宏在单独有用的页面中。)

Thansk给出了澄清的答案