A Common Lisp lehetővé teszi a programozó számára, hogy „megjegyzéseket” írjon, amelyeket a számítógép figyelmen kívül hagy.
Az egysoros megjegyzések egy vagy több pontosvesszővel (;) kezdődnek, és néha láthatod a következőt:
(code...) ; => value
Ahol a megjegyzés arra szolgál, hogy jelezze, milyen értéket ad vissza a Common Lisp a sorban lévő kód futtatása után.
Idiomatikus, hogy egy pontosvesszőt használunk egy rövid megjegyzéshez a sor végén, kettőt egy hosszabb megjegyzéshez egy kódrészlet felett, hármat egy hosszú megjegyzéshez, amely leír valamit, például egy függvényt, és négyet egy olyan megjegyzéshez, mint egy fejléc a forrásfájl tetején.
Minden Common Lisp objektum vagy „atom” (egyetlen, oszthatatlan érték), vagy „cons” (amit a „cons” konstruktor függvény épít fel).
Egy cons két részből áll: az első elemből és a többi elemből.
Történelmi okokból ezt a két részt car-nak és cdr-nek nevezik.
Amikor ezeket a consokat kódként értékeljük ki, az első elem (car) a meghívott függvényt képviseli, míg a többi elem (cdr) a függvény argumentumait:
(<function> <arg1> <arg2> ... <argN>)
; ^ car ^ | ^ cdr ^
Minden Common Lisp kód S-kifejezésekből (szimbolikus kifejezésekből) áll. Ezeket röviden sexpr-eknek hívják. Minden sexpr vagy atom, vagy cons. Amikor az S-kifejezéseket kiértékeljük, automatikusan visszaadnak valamilyen értéket, amely a kifejezés helyére kerül. Amikor saját függvényeket írsz (a defun használatával), a defun törzsében lévő utolsó érték automatikusan visszaadódik:
;; Defining a new function
(defun gimme-foo () 'foo)
;; Calling the function as an S-Expression
(gimme-foo) ; => FOO
A szimbólumok a Common Lispben speciális értékek, amelyek más értékekre mutathatnak, vagy kulcsszavak esetében önmagukra. Amikor a Lisp kiértékeli a szimbólumokat, azok helyére a mutatott értékek kerülnek:
foo ; => <whatever-foo-points-to>
:foo ; => :FOO
Vedd figyelembe, hogy a kulcsszavakat egy kezdő kettőspont (:) jelöli.
Az idézés, vagyis a ' hozzáadása egy S-kifejezés elé, arra utasítja a Lispt, hogy ne értékelje ki azt a kifejezést.
Azzal, hogy idézőjelet tettünk a 'foo elé a defun példánkban, elkerültük, hogy a Lisp megpróbálja kikeresni (és nem találja) azt, amire a FOO mutatott volna, és helyette magát a FOO értéket adta vissza.
Ha a FOO nincs sehol definiálva a programunkban:
foo ; => <ERROR! Lisp doesn't know what foo points to!>
'foo ; => FOO
Egyelőre ezt tekintheted egyszerűen úgy, mint egy módot arra, hogy szimbólumokat adj vissza egy függvényből, de később újra elővesszük az idézést, és a jövőbeli tanulófeladatokban tovább vizsgáljuk a következményeit.
Te! Igen, te, bátor Lisp-programozó! Lenny, a lisp űrlény segítségre szorul! Lenny együtt szeretne lógni a többi lisp űrlényel, de a szülei azt mondták neki, hogy addig nem megy sehova, amíg rend nem lesz a szobájában.
A gond az, hogy Lenny alig látja a padlót! Nem tudja megkülönböztetni egymástól az atomokat és a consokat, a szimbólumokat és a kulcsszavakat, meg a car-t és a cdr-t!
Segítesz Lennynek rendet tenni ebben a zűrzavarban? Ne felejtsd el a zárójeleidet, szükséged lesz rájuk!
Mielőtt Lenny nekiláthat, fel kell frissítenie a tudását arról, hogyan is néznek ki a szimbólumok és a kulcsszavak, hiszen jó ideje nem takarított már... Segíts Lennynek azzal, hogy definiálsz két függvényt: a lennys-favorite-food függvényt, amely egy szimbólumra értékelődik ki, és a lennys-secret-keyword függvényt, amely egy kulcsszóra értékelődik ki. Például:
(lennys-favorite-food) ; => LASAGNA
(lennys-secret-keyword) ; => :ALIENS-ARE-REAL
Figyelem: bármilyen szimbólumot vagy kulcsszót visszaadhatsz, amilyet csak szeretnél (ha nem rajongsz a lasagnéért, vagy nem hiszel az űrlényekben).
Miután Lenny felfrissítette a szimbólumokról és a kulcsszavakról szerzett ismereteit, ideje takarítani! Hogy rendet tegyen a szobájában szanaszét heverő S-kifejezések között, Lennynek segítségre van szüksége annak eldöntéséhez, hogy mi számít consnak és mi atomnak. Te is segíthetsz, ha megvalósítasz két függvényt: is-an-atom-p és 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
Ebben a részben több beépített Lisp-függvény is hasznos lehet a számodra. Egyelőre ráadásul egyszerűen tekintheted a T-t igaznak és a NIL-t hamisnak.
Végül Lenny consjai túl terjedelmesek ahhoz, hogy szépen el lehessen pakolni őket, ezért kisebb részekre kell szednie őket. Segítesz, és definiálsz még két függvényt a consok szétszedésére (first-thing és rest-of-it)?
(first-thing '(first second third)) ; => FIRST
(rest-of-it '(first second third)) ; => (SECOND THIRD)
Megint csak jól jöhet néhány beépített Common Lisp-függvény.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Common Lisp nyelvet 27 fogalom92 feladat segítségével, valódi emberi mentorálással, mindez ingyen.