Вызов функции без 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

Задание

  1. Определите (без создания переменной) и вызовите функцию, которая находит среднее арифметическое между двумя числами. В качестве чисел подставьте 2 и 4.
  2. Запишите результат в переменную.
  3. Выведите переменную на экран.

Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics

Упражнение доступно только авторизованным пользователям.

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