sS replaceDollarVars_withCustomToString(IF1 stringifier, S s, O... params) { if (empty(params)) ret s; MapSO vars = mapKeys dropDollarPrefix((MapSO) litcimap(params)); ret replaceDollarVars_dyn(s, var -> { O value = vars.get(var); ret value == null ?: stringifier.get(value); }); }