Пусть древовидная структура данных определяется как таковая:
У дерева один узел в качестве корня. Узел является либо листом, либо внутренним узлом, у которого есть один или несколько узлов в качестве дочерних.
В каком-то псевдо-объектно-ориентированном языке программирования мы можем определить такое дерево:
Node := InnerNode | Leaf
Leaf {
isLeaf() : TRUE
}
InnerNode {
isLeaf() : FALSE
children() : List<Node>
}
Tree {
root() : Node
}
Теперь мы можем определить две функции: bad_code и good_code. Функция bad_code не компилируется, другая функция:
function bad_code(Node anyNode) : void {
// this will give a compile time error "type Node does not define method children()"
anyNode.children();
}
function good_code(Node anyNode) : void {
// the compiler understands that all Nodes must have a method called isLeaf() which
// returns a boolean
let b : boolean <- anyNode.isLeaf();
if (b == FALSE) {
// this will not give a compile time error because the compiler can deduce that
// anyNode must be of type InnerNode which has the method children()
anyNode.children();
}
}
Вопрос:
- Является ли приведенное выше примером языковой функции, которая была определена / описана каким-либо официальным образом?
- Если да, то как официально называется эта языковая функция?
- Существуют ли какие-либо реальные языки программирования, которые реализуют эту функцию языка?
- Можно ли реализовать эту языковую функцию как проверку во время компиляции с нулевыми затратами во время выполнения?