Racket: Вызов функции без define
Вспомним функцию square
из прошлого урока:
(define square (lambda (n) (* n n)))
(square 5) ; 25
Попробуйте ответить на вопрос, можно ли вызывать функцию сразу после объявления без использования define
?
Конечно можно, как и во всех других языках с поддержкой анонимных функций. Для этого достаточно, в форме вызова, подставить вместо имени саму функцию:
((lambda (n) (* n n)) 5)
Необычность этой структуры в том, что здесь первый элемент не идентификатор, а выражение, возвращающее функцию (а определение анонимной функции возвращает саму функцию). Из-за этого возникает двойная скобка. Проще всего это понять, если всегда воспринимать скобки как вызов. В дальнейшем при работе со списками, как с данными, мы увидим, что это не всегда так, но на данном этапе данное упрощение полезно.
В форме вызова сразу после функции перечисляются параметры. В данном примере параметр только один, это 5. Так будет выглядеть пример вызова функции с двумя аргументами:
((lambda (x y) (+ x y))
8 7) ; 15
Вызов функции - обычное выражение, это значит что его можно использовать во всех местах, где возможно появление выражения. В Lisp-языках это почти любые части программы:
(displayln ((lambda (x y) (+ x y))
8 7)) ; => 15
Задание
- Определите (без создания переменной) и вызовите функцию, которая находит среднее арифметическое между двумя числами. В качестве чисел подставьте 2 и 4.
- Запишите результат в переменную.
- Выведите переменную на экран.
Пожалуйста, авторизуйтесь, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт.