Вы можете сделать следующее: Предположим, у вас есть A, B & amp; C функционирует следующим образом:
bool A()
{
.....
}
bool B()
{
.....
}
bool C()
{
.....
}
Теперь о какой-то другой функции, скажем в основном:
int main()
{
bool (*choice) ();
// now if there is if-else statement for making "choice" to
// point at a particular function then proceed as following
if ( x == 1 )
choice = A;
else if ( x == 2 )
choice = B;
else
choice = C;
if(choice())
printf("Success\n");
else
printf("Failure\n");
.........
.........
}
Помните, что это один пример для указателя на функцию. Есть несколько других методов, для которых вам нужно четко изучить указатель на функцию.
Это действительно просто. Когда у вас есть какое-то вычисление, например добавление 3 к 5, в вашей программе, то создание преобразователя означает , а не , чтобы вычислить его напрямую, а вместо этого создайте функцию с нулевыми аргументами, которая будет вычислять ее, когда фактическая необходимо значение.
(let ((foo (+ 3 5))) ; the calculation is performed directly, foo is 8
;; some other things
(display foo)) ; foo is evaluated to 8 and printed
(let ((foo (lambda () (+ 3 5)))) ; the calculation is delayed, foo is a
; function that will perform it when needed
;; some other things
(display (foo))) ; foo is evaluated as a function, returns 8 which is printed
Во втором случае foo
будет называться преобразователем.
Ленивые языки стирают грань между привязкой переменной к значению и созданием функции, возвращающей это значение, поэтому что написание чего-то вроде первой формы выше фактически рассматривается как вторая, под капотом.
«Преобразователь» - это объект процедуры без формальных аргументов, например, из вашей ссылки SRFI:
(lambda () (write '(b1)))
Переменная b1 связана во включающем блоке, и это дает нам ключ к этимология слова «thunk», которое основано на шутке о плохой грамматике.
Функция без аргументов не имеет возможности изменить свое поведение на основе параметров, с которыми она вызывается, поскольку у нее нет параметров. Таким образом, вся работа функции задана - она просто ожидает выполнения. Со стороны компьютера больше не требуется «думать», все «размышления» были выполнены - действие полностью «преобразовано».
Это все «преобразователь» в контексте этого SRFI - процедура без аргументов.
Википедия дает следующий ответ:
В функциональном программировании «преобразователь» - это другое название нулевой функции - функции, которая не принимает аргументов. Преобразователи часто используются в строгих языках как средство имитации ленивых вычислений; сам преобразователь задерживает вычисление аргумента функции, а функция заставляет преобразователь получить фактическое значение. В этом контексте преобразователь часто называется приостановкой или (на схеме) обещанием.
Добавление примера отложенного вычисления в схему . Здесь обещание - это другое слово для обозначения thunk.