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.
- Запишите результат в переменную.
- Выведите переменную на экран.
Ваше упражнение проверяется по этим тестам
#lang racket
(require "../../../src/tests.rkt")
(assert-output "3")Решение учителя откроется через:
20:00
