Щоб визначити глобальну функцію в Common Lisp, ми використовуємо вираз defun.
Першим аргументом цей вираз приймає список параметрів (порожній список означає, що функція не має параметрів).
Далі йде необовʼязковий рядок тексту документації (англ. string), про який ідеться нижче, а потім нуль або більше виразів, які складають «тіло» функції.
Функції можуть мати нуль або більше параметрів.
(defun no-args () (+ 1 1))
(defun add-one (x) (1+ x))
(defun add-nums (x y) (+ x y))
Щоб викликати функцію, ми обчислюємо вираз, першим елементом якого є символ, що позначає функцію, а рештою елементів - аргументи функції (якщо вони є).
Результатом обчислення функції стає значення останнього обчисленого виразу в тілі функції. Усі функції обчислюються до якогось значення.
(add-nums 2 2) ;; => 4
Функції також можуть мати, необовʼязково, рядок тексту документації (який ще називають «докстрінг»).
Якщо його вказано, він іде після списку аргументів, але перед тілом функції.
До рядка тексту документації можна дістатися через documentation.
(defun add-nums (x y) "Add X and Y together" (+ x y))
(documentation 'add-nums 'function) ;; => "Add X and Y together"
;; Note that if one provides a docstring but fails to provide a body
;; then the docstring is interpreted by Common Lisp as the body, not
;; the docstring
(defun no-body ())
(no-body) ;; => NIL
(defun mistake () "This is not a docstring")
(mistake) ;; => "This is not a docstring"
(documentation 'mistake 'function) ;; => NIL
Ліллі, іншопланетянка з Ліспу, повернулася і знову готує! Цього разу вона створить лазанью іншопланетянки з Ліспу, яка не цілком несхожа на людську лазанью.
Ліллі знадобляться функції, які допоможуть визначити час приготування лазаньї. І кожна з них повинна мати добру документацію, щоб Ліллі не забула, що робить кожна з них.
Допоможімо Ліллі написати функції, які визначатимуть час приготування лазаньї?
Визначте функцію expected-time-in-oven, яка не приймає жодних параметрів і повертає, скільки хвилин лазанья повинна перебувати в духовці. За традицією іншопланетян з Ліспу (так само, як готувала батьківська одиниця Ліллі), очікуваний час у духовці становить 337 хвилин:
(expected-time-in-oven) ;; => 337
Визначте функцію remaining-minutes-in-oven, яка приймає як параметр фактичну кількість хвилин, які лазанья вже провела в духовці, і повертає, скільки хвилин лазаньї ще потрібно залишатися в духовці, виходячи з очікуваного часу в духовці з попереднього завдання.
(remaining-minutes-in-oven 100) ;; => 237
Визначте функцію preparation-time-in-minutes, яка приймає як параметр кількість шарів, які Ліллі додала до лазаньї, і повертає, скільки хвилин Ліллі витратила на підготовку лазаньї, якщо припустити, що на кожен шар потрібно 19 хвилин.
(preparation-time-in-minutes 3) ;; => 57
Визначте функцію elapsed-time-in-minutes, яка приймає два параметри: перший параметр - це кількість шарів, які Ліллі додала до лазаньї, а другий параметр - кількість хвилин, які лазанья вже пробула в духовці. Функція повинна повернути, скільки хвилин Ліллі витратила на приготування лазаньї, тобто суму часу на підготовку у хвилинах і часу в хвилинах, який лазанья на цей момент провела в духовці.
(elapsed-time-in-minutes 3 100) ;; => 157
Зареєструйтеся на Exercism, щоб вивчати й опановувати Common Lisp, а також 27 концепцій92 вправи та справжнє наставництво від людей, і все це безкоштовно.