Как взять вектор вариантов AST аргумента функции, извлечь значения и использовать их для создания экземпляра вызова функции?
Я пишу переводчик, который оценивает определенные выражения. Некоторые выражения являются вызовами функций. Мне трудно понять, как перевести вызовы функций AST в фактический вызов. AST дает мне имя функции и вектор аргументов. Я могу найти указатель функции для вызова по имени, используя карту, но передача аргументов указателю на функцию является проблемой.
В Rust нет оператора splat (расширение аргумента). Я мог бы передать их как кортеж и использовать деструктуризацию аргументов, но я не могу понять, как преобразовать вектор вариантов перечисления аргументов AST в кортеж конкретных типов.
Я не могу просто отобразить или перебрать аргументы AST для извлечения значений и создания кортежа.
Я могу использовать вложенные кортежи для постепенного построения гетерогенного списка:
fn prepend<I,T>(i: I, t: T) -> (I,T) { (i, t) }
fn foo() {
let x = ();
let x = prepend(1, x);
let x = prepend(2.0, x);
let x = prepend(true, x);
}
Но это работает только потому, что x
затеняется, а новая привязка имеет другой тип. Это не сработает:
fn foo() {
let mut x = ();
x = prepend(1, x);
x = prepend(2.0, x);
x = prepend(true, x);
}
Есть идеи?