WhatAmIDoing - это функция высшего порядка , потому что это функция, которая возвращает другую функцию.
Он возвращает thunk & mdash; замыкание, созданное для отложенного вычисления фактического значения. Обычно thunks создаются для ленивой оценки выражения (и, возможно, для его запоминания), но в других случаях вместо простого значения требуется просто функция, как в случае «constantly 5
», который в некоторых языках возвращает функция, которая всегда возвращает 5.
Последнее может применяться в приведенном примере, поскольку, предполагая, что язык оценивается в аппликативном порядке (т. Е. Оценивает аргументы перед вызовом функции), функция не служит никакой другой цели, кроме как превращать значения в функцию, которая их возвращает. 1010 *
WhatAmIDoing действительно является реализацией "постоянно" функции, которую я описывал. Но в общем случае вам не нужно возвращать только args
во внутренней функции. Вы можете вернуть "ackermann(args)
", что может занять много времени, как в ...
function WhatAmIDoing2(args...)
return function()
return ackermann(args)
end
end
Но WhatAmIDoing2 немедленно вернется, потому что оценка функции ackermann будет приостановлена в замыкании . (Да, даже на языке вызовов по значению.)