Что такое 'преобразователь', как используется в Схеме или в целом?

Вы можете сделать следующее: Предположим, у вас есть 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");

.........
  .........
  }

Помните, что это один пример для указателя на функцию. Есть несколько других методов, для которых вам нужно четко изучить указатель на функцию.

56
задан 29 May 2009 в 10:35
поделиться

3 ответа

Это действительно просто. Когда у вас есть какое-то вычисление, например добавление 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 будет называться преобразователем.

Ленивые языки стирают грань между привязкой переменной к значению и созданием функции, возвращающей это значение, поэтому что написание чего-то вроде первой формы выше фактически рассматривается как вторая, под капотом.

69
ответ дан 26 November 2019 в 17:14
поделиться

«Преобразователь» - это объект процедуры без формальных аргументов, например, из вашей ссылки SRFI:

(lambda () (write '(b1)))

Переменная b1 связана во включающем блоке, и это дает нам ключ к этимология слова «thunk», которое основано на шутке о плохой грамматике.

Функция без аргументов не имеет возможности изменить свое поведение на основе параметров, с которыми она вызывается, поскольку у нее нет параметров. Таким образом, вся работа функции задана - она ​​просто ожидает выполнения. Со стороны компьютера больше не требуется «думать», все «размышления» были выполнены - действие полностью «преобразовано».

Это все «преобразователь» в контексте этого SRFI - процедура без аргументов.

41
ответ дан 26 November 2019 в 17:14
поделиться

Википедия дает следующий ответ:

В функциональном программировании «преобразователь» - это другое название нулевой функции - функции, которая не принимает аргументов. Преобразователи часто используются в строгих языках как средство имитации ленивых вычислений; сам преобразователь задерживает вычисление аргумента функции, а функция заставляет преобразователь получить фактическое значение. В этом контексте преобразователь часто называется приостановкой или (на схеме) обещанием.

Добавление примера отложенного вычисления в схему . Здесь обещание - это другое слово для обозначения thunk.

14
ответ дан 26 November 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: