Если у вас есть некоторое выражение, и вы хотите оценить его для большого количества строк данных, то вы можете только один раз скомпилировать его в дерево лямбда-выражений и вообще не вычислять какие-либо переключатели на каждой итерации;
Например, с учетом следующего: {* (a, {+ (b, c)})}
Функция компиляции (на очень грубом псевдо-языке) будет выглядеть примерно так:
func (e *evaluator) compile(brunch ast) {
switch brunch.type {
case binaryOperator:
switch brunch.op {
case *: return func() {compile(brunch.arg0) * compile(brunch.arg1)}
case +: return func() {compile(brunch.arg0) + compile(brunch.arg1)}
}
case BasicLit: return func() {return brunch.arg0}
case Ident: return func(){return e.GetIdent(brunch.arg0)}
}
}
Итак, в конце концов компиляциявозвращает функцию, которая должна вызываться в каждой строке ваших данных, и в ней не будет никаких переключателей или других вычислительных средств.Остается вопрос об операциях с данными разных типов, то есть для вашего собственного исследования;) Это интересный подход в ситуациях, когда нет доступного механизма таблиц переходов :), но, конечно, вызов func является более сложной операцией, чемпрыгать.