Да ... лязг . C ++ имеет все в вашем списке, за исключением понимания списка. Это также основной язык LLVM.
"Статически набраны"
Да
«Использовать вывод типа»
// local type inference
auto var = 10;
// type inference on parameters to generic functions
template <typename T>
void my_function(T arg) {
...
}
my_function(1) // infers that T = int
// correctly handles more complicated cases where type is partially specified.
template <typename T>
void my_function(std::vector<T> arg) {
...
}
std::vector<int> my_vec = {1, 2, 3, 4};
my_function(my_vec) // infers that T = int
"Функциональны (то есть лямбда-выражения, замыкания, примитивы списков, списки и т. Д.)"
Лямбды в c ++ выглядят как [capture_spec](arglist...) { body }
. Вы можете захватить закрытые переменные по ссылке (аналогично lisp) следующим образом: [&]. Кроме того, вы можете захватить по значению, например, так: [=].
int local = 10;
auto my_closure = [&]() { return local;};
my_closure(); // returns 10.
В C ++ map zip и redund называются std :: transform и std :: аккумулировать.
std::vector<int> vec = {1, 2, 3, 4};
int sum = std::accumulate(vec.begin(), vec.end(), [](int x, int y) { return x + y; });
Вы также можете настроить списки, используя макрос и обертку вокруг std :: transform, если вы действительно хотите ...
«Иметь первоклассные объектно-ориентированные функции (наследование, полиморфизм, миксины и т. Д.)»
Конечно. C ++ позволяет виртуальную диспетчеризацию + множественное наследование + наследование реализации. Примечание: миксины - это просто наследование реализации. Вам нужен только специальный механизм "mixin", если ваш язык запрещает множественное наследование.
«Иметь сложную систему типов (дженерики, ковариации и контравариантности и т. Д.)»
Шаблоны C ++, насколько я знаю, являются самой мощной универсальной системой на любом языке.