Package xyz.cofe.cxel.eval
Interface CallScoring<CALL extends PreparedCall>
- Type Parameters:
CALL- тип вызова
- All Known Implementing Classes:
DefaultScrolling
public interface CallScoring<CALL extends PreparedCall>
Подсчет кол-ва очков для конкретного вызова.
ДилеммаДопустим у нас есть два метода/функции с одинаковыми названифми, но разными аргументами:
// Сложение чисел int add( int a, int b ) // Конкатенация строк String add( String a, string b )AST дерево:
BinaryOpAST(operator=Keyword.Plus)-
- AST
BinaryOpAST.left()=VarRefAST - AST
BinaryOpAST.right()=VarRefAST
- AST
Eval.context().bind( "+", ссылка на методы add )).
Соответственно, без типов данных нельзя вывести из AST какой метод необходимо вызвать.
В runtime происходит вызов
EvalContext.call(String, List)},
где передаются след аргументы
- inst = null
- method = "+"
- args =
- "abc"
- "def"
EvalContext.bind(String, Object)
задано соответствие + и методов add Необходимо выбрать подходящий метод из возможных
Основная идея в том, чтоб для нескольких вариантов вызовов выбрать наиболее подходящий, путем подсчет кол-ва очков.
Каждое очко - это дополнительное действие на вызов (конвертация аргментов или еще какая либо метрика)Тот вариант, который набрал наименьшее кол-во очков будет вызван.
-
Method Summary
Modifier and Type Method Description intcalculate(CALL preparedCall, PreparingCalls scope)Подсчет кол-ва баллов для конкретного варианта вызова
-
Method Details
-
calculate
Подсчет кол-ва баллов для конкретного варианта вызова- Parameters:
preparedCall- вариант вызоваscope- Область из которой был подготовлен вызов- Returns:
- кол-во баллов
-