Common Lisp дозволяє програмісту писати «коментарі», які компʼютер ігнорує. Однорядкові коментарі починаються з однієї або кількох крапок з комою (;), і час від часу можна побачити таке:
(code...) ; => value
Тут коментар ужито, щоб позначити, яке значення повертає Common Lisp після виконання коду в цьому рядку.
Ідіоматично вживати одну крапку з комою для короткого коментаря в кінці рядка, дві - для довшого коментаря над ділянкою коду, три - для довгого коментаря, що описує щось, наприклад функцію, і чотири - для коментаря на кшталт заголовка на початку вихідного файлу.
Усі обʼєкти Common Lisp є або «атомами» (поодинокими, неподільними значеннями), або «консами» (утвореними функцією-конструктором «cons»).
Cons складається з двох частин: першого елемента та решти елементів.
З історичних причин ці дві частини називають car і cdr.
Коли ці конси обчислюють як код, перший елемент (car) представляє функцію, яку викликають, а решта елементів
(cdr) представляють аргументи цієї функції:
(<function> <arg1> <arg2> ... <argN>)
; ^ car ^ | ^ cdr ^
Увесь код Common Lisp складається з S-виразів (символьних виразів). Їх скорочено називають sexpr. Кожен sexpr є або атомом, або консом. Коли S-вирази обчислюються, вони автоматично повертають деяке значення, яке заступає місце виразу. Коли ми пишемо власні функції (за допомогою defun), останнє значення в тілі defun повертається автоматично:
;; Defining a new function
(defun gimme-foo () 'foo)
;; Calling the function as an S-Expression
(gimme-foo) ; => FOO
Символи в Common Lisp - це особливі значення, які можуть указувати на інші значення або, у випадку ключових слів, на самих себе. Коли Lisp обчислює символи, він замінює їх на значення, на які вони вказують:
foo ; => <whatever-foo-points-to>
:foo ; => :FOO
Зауважмо, що ключові слова позначено провідною двокрапкою (:).
Цитування, тобто додавання ' перед S-виразом, вказує Lisp не обчислювати цей вираз.
Зацитувавши 'foo у нашому прикладі з defun, ми уникнули того, що Lisp намагався б знайти (і не знайшов) те, на що мав указувати FOO; натомість повернулося саме значення FOO.
Якщо FOO ніде в нашій програмі не визначено:
foo ; => <ERROR! Lisp doesn't know what foo points to!>
'foo ; => FOO
Поки що це можна розглядати просто як спосіб повертати символи з функції, але ми повернемося до цитування і глибше дослідимо його наслідки в майбутніх концептуальних вправах.
Агов, сміливі ліспери! Ленні, лісп-прибульцю, потрібна допомога! Ленні хоче піти погуляти з усіма іншими лісп-прибульцями, але батьки сказали Ленні, що нікуди не пустять, поки в кімнаті не прибрано.
Річ у тім, що Ленні ледве бачить підлогу! Ленні не відрізняє свої атоми від консів, символи від ключових слів, car від cdr!
Чи можемо ми допомогти Ленні дати раду цьому безладдю? Не забудьмо свої дужки, вони нам знадобляться!
Перш ніж Ленні почне, треба нагадати, як мають вигляд символи та ключові слова, адже від останнього прибирання минуло чимало часу... Допоможіть Ленні, визначивши дві функції: lennys-favorite-food, яка обчислюється в певний символ, і lennys-secret-keyword, яка обчислюється в певне ключове слово. Наприклад:
(lennys-favorite-food) ; => LASAGNA
(lennys-secret-keyword) ; => :ALIENS-ARE-REAL
Зауважте, що можна повернути будь-який символ чи ключове слово (якщо ми не любимо лазанью чи не віримо в прибульців).
Щойно Ленні пригадає символи та ключові слова, настане час прибирати! Щоб розібрати всі S-вирази, розкидані по кімнаті, Ленні потрібна допомога визначити, що є консом, а що атомом. Допоможіть, реалізувавши дві функції, is-an-atom-p та is-a-cons-p:
(is-an-atom-p 'one-thing) ; => T
(is-an-atom-p '(two things)) ; => NIL
(is-a-cons-p 'one-thing) ; => NIL
(is-a-cons-p '(two things)) ; => T
У цьому розділі може стати в пригоді чимало вбудованих функцій Lisp. Крім того, поки що T можна просто вважати правдою, а NIL неправдою.
Нарешті, конси Ленні надто громіздкі, щоб акуратно їх скласти, тож їх треба розділити на менші частини. Допоможіть, визначивши ще дві функції, які розберуть їхні конси (first-thing і rest-of-it).
(first-thing '(first second third)) ; => FIRST
(rest-of-it '(first second third)) ; => (SECOND THIRD)
І знову тут можуть стати в пригоді деякі вбудовані функції Common Lisp.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Common Lisp, а також 27 концепцій92 вправи та справжнє наставництво від людей, і все це безкоштовно.