Kurzusok
/
Common Lisp
Common Lisp
/
Feladatok
/
Zoknik és S-kifejezések rendezése
Zoknik és S-kifejezések rendezése

Zoknik és S-kifejezések rendezése

Tanulófeladat

Bevezetés

Megjegyzések

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.

Cons

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 ^

Kifejezések

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

Szimbólumok

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.

Utasítások

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!

1. Frissítsd fel Lenny ismereteit a szimbólumokról

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).

2. Segíts Lennynek megkülönböztetni az atomokat a consoktól

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.

3. Segíts Lennynek szétszedni a consjait

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.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Common Lisp Exercism

Készen állsz elkezdeni a(z) Zoknik és S-kifejezések rendezése feladatot?

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.