Clojure: Вызов функции без def
Вспомним функцию cube из прошлого урока:
(def cube (fn [n] (* n n n)))
(cube 2) ; 8Попробуйте ответить на вопрос, можно ли вызывать функцию сразу после объявления без использования def? Конечно можно, как и во всех других языках с поддержкой анонимных функций. Для этого достаточно, в форме вызова, подставить вместо имени саму функцию:
((fn [n] (* n n n)) 2) ; 8Необычность этой структуры в том, что здесь первый элемент не идентификатор, а выражение, возвращающее функцию (а определение анонимной функции возвращает саму функцию). Из-за этого возникает двойная скобка. Проще всего это понять, если всегда воспринимать скобки как вызов. В дальнейшем при работе со списками, как с данными, мы увидим, что это не всегда так, но на данном этапе данное упрощение полезно. В форме вызова сразу после функции перечисляются параметры. В данном примере параметр только один, это 2. Так будет выглядеть пример вызова функции с двумя аргументами:
((fn [x y] (+ x y))
2 3) ; 5Вызов функции — обычное выражение, это значит что его можно использовать во всех местах, где возможно появление выражения. В Lisp-языках это почти любые части программы:
(println ((fn [x y] (+ x y))
8 7)) ; => 15Задание
- Определите (без создания переменной) и вызовите функцию, которая находит среднее арифметическое между двумя числами. В качестве чисел подставьте 2 и 4.
- Запишите результат в переменную.
- Выведите переменную на экран.
Полезное
Clojure: Вызов функции без def
Вспомним функцию cube из прошлого урока:
(def cube (fn [n] (* n n n)))
(cube 2) ; 8Попробуйте ответить на вопрос, можно ли вызывать функцию сразу после объявления без использования def? Конечно можно, как и во всех других языках с поддержкой анонимных функций. Для этого достаточно, в форме вызова, подставить вместо имени саму функцию:
((fn [n] (* n n n)) 2) ; 8Необычность этой структуры в том, что здесь первый элемент не идентификатор, а выражение, возвращающее функцию (а определение анонимной функции возвращает саму функцию). Из-за этого возникает двойная скобка. Проще всего это понять, если всегда воспринимать скобки как вызов. В дальнейшем при работе со списками, как с данными, мы увидим, что это не всегда так, но на данном этапе данное упрощение полезно. В форме вызова сразу после функции перечисляются параметры. В данном примере параметр только один, это 2. Так будет выглядеть пример вызова функции с двумя аргументами:
((fn [x y] (+ x y))
2 3) ; 5Вызов функции — обычное выражение, это значит что его можно использовать во всех местах, где возможно появление выражения. В Lisp-языках это почти любые части программы:
(println ((fn [x y] (+ x y))
8 7)) ; => 15Задание
- Определите (без создания переменной) и вызовите функцию, которая находит среднее арифметическое между двумя числами. В качестве чисел подставьте 2 и 4.
- Запишите результат в переменную.
- Выведите переменную на экран.
Полезное
Ваше упражнение проверяется по этим тестам
(ns lambda-call-test
(:require [test-helper :refer [assert-output]]))
(assert-output "3")Решение учителя откроется через:
20:00
