Сейчас продумываю такую концепцию, как вызываемые блоки:
{template foo()}
{forEach arr => el}
{block elem(el)}
...
{/}
{/}
{/}
Конструкция с block будет отрендерена как
if (!foo.elem) {
foo.elem = function (el) {
...
};
}
foo.elem(el);
Т.е. создаётся функция, которая сохраняется как свойство функции-шаблона. Это решает проблему, когда нужно создать подшаблон, который должен иметь доступ к переменным замыкания главного шаблона и быть доступен для повторного вызова "вне шаблона", т.е. из JS, но в тоже время будет являться структурной единицей Snakeskin, т.е. можно явно переопределять в дочернем шаблоне и использовать директиву super.