Когда то Кнут придумал тест для ALGOL реализаций, и он известен под именем «Man or boy test». Но там просто локальные функции, не особо интересно.
Предоставляю вам версию для проверки языка программирования, на то, достоен ли он существовать в 21 веке!
Для начала нарушу это правило (у Python динамическая типизация), и покажу Python версию:
def print_sum(x):
def make(acc):
def f(y):
print("acc(%d) + %d" % (acc, y))
return make (acc + y)
return f
return make(x)
print_sum(10)(20)(30)(40)
acc(10) + 20
acc(30) + 30
acc(60) + 40
Предлагаю попробовать повторить пример на вашем любимом статически типизированном языке, и поделиться им в комментариях.
Мое повторение на OCaml с rectypes:
let print_sum x =
let rec f acc = fun y ->
printf "acc(%d) + %d\n" acc y;
f (acc + y)
in
f x
let () = ignore (print_sum 10 20 30 40)
type t = int -> t
let print_sum (x : int) : t =
let rec f (acc : int) : t = fun (y : int) : t ->
printf "acc(%d) + %d\n" acc y;
f (acc + y)
in
f x
let () = ignore (print_sum 10 20 30 40)
Языки которые смогли реализовать тест на лямбдах/функциях, их система типов и ее записи позволяет строить рекурсивные по возврату лямбды и функции:
Языки у которых получилось, но замыкания были выраженны через структуры, потому что они так представленны в самом языке, это облегачает построение рекурсивных по возврату типов, потому что рекурсии в структурах есть везде:
Языки у которых пока не получилось без дополнительных средств типа классов/структур для обхода проблем с типами:
- Rust (использование trait)
- C (некорректная реализация)
- Zig (использование классов)
- D (использование делегатов)
Не являсь полностью статически типизированным языком, через свою систему типов смогли выразить пример