
- •Домашнє завдання з дисципліни " Обчислювальна техніка та програмування" на тему: "Мова програмування clojure"
- •Можливості мови
- •Основні типи даних
- •Коллекції Clojure
- •Функції:
- •Макроси:
- •Шаблони
- •Робота зі змінними даними
- •Складання блок-схем
- •Основні поняття мови: числа, рядки, ідентифікатори, описи, оператори.
- •Методологія процедурно-орієнтованого програмування
Функції:
Функції в загальному випадку створюються за допомогою макросу fn. Для оголошення функцій на верхньому («глобальному») рівні простору імен використовуються макроси defn або defn-, які розкриваються в запис виду (def ім'я-функції (fn ...)). Другий макрос відрізняється від першого тільки тим, що функція буде видно тільки в поточному просторі імен. Наприклад, наступні оголошення є однаковими:
(def func1 (fn [x y] (+ x y)))
(defn func2 [x y] (+ x y))
У загальному вигляді оголошення функції за допомогою fn виглядає як (fn ім'я? [Аргументи *] умови? Вираження +). Функція також може мати різні набори аргументів (різне число параметрів) - тоді оголошення буде виглядати як (fn ім'я? ([Аргументи *] умови? Вираження +) +). Наприклад, оголошення функції:
(defn func3
([x] "one argument")
([x y] "two arguments")
([x y z] "three arguments"))
дозволяє викликати її з одним, двома або трьома аргументамі9. Програміст також може визначити функцію, що має змінне число параметрів, якщо вкаже знак амперсанд (&) перед аргументом, в який будуть поміщені залишилися параметри. Наприклад, наступний код:
user> (defn func4 [x y & z] z)
user> (func4 1 2)
nil
user> (func4 1 2 3 4)
(3 4)
оголосить функцію func4, що має два обов'язкових параметра - x і y, а інші параметри будуть поміщені в список, який буде передано як аргумент z.Для оголошення невеликих анонімних функцій використовується спеціальний запис # (вираження +), а доступ до аргументів проводиться за допомогою спеціальних змінних% +1,% 2 і т. д., або просто%, якщо функція приймає один параметр. Наприклад, такі вирази еквівалентні:
(#(+ %1 %2) 10 20)
((fn [x y] (+ x y)) 10 20)
У Clojure є набір функцій, які дозволяють створювати нові функції на основі існуючих. Функція partial використовується для створення функцій з меншою кількістю аргументів шляхом підстановки частини параметрів (каррірованіе), а функція comp створює нову функцію з декількох функцій (композиція функцій):
user> (defn sum [x y] (+ x y))
user> (def add-5 (partial sum 5))
user> (add-5 10)
15
user> (def my-second (comp first rest))
user> (my-second [1 2 3 4 5])
2
Макроси:
Макроси - це потужний засіб зменшення складності коду, що дозволяють будувати проблемно-орієнтоване середовище на основі базової мови. Макроси активно використовуються в Clojure, і безліч конструкцій, складових мову, визначені як макроси на основі обмеженої кількості спеціальних форм і функцій, реалізованих в ядрі мови.
Тіло макросу має представляти собою список виразів мови, результат виконання яких буде підставлений на місце використання макросу у вигляді списку Clojure, що містить набір операцій.
Приклади макросів:
макрос when, визначений у базовій бібліотеці:
(defmacro when
"Evaluates test. If logical true, evaluates body in an implicit do."
[test & body]
(list 'if test (cons 'do body)))
when - це досить простий макрос. Більш складні макроси можуть створювати змінні, мати різну кількість аргументів, і т. д. Наприклад, макрос and, певний таким чином:
2) (defmacro and
"Evaluates exprs one at a time, from left to right.
If a form returns logical false (nil or false), and
returns that value and doesn't evaluate any of the
other expressions, otherwise it returns the value
of the last expr. (and) returns true."
([] true)
([x] x)
([x & next]
`(let [and# ~x]
(if and# (and ~@next) and#))))[3]