Kurzusok
/
Common Lisp
Common Lisp
/
Feladatok
/
Szolgálatra jelentkezés
Szolgálatra jelentkezés

Szolgálatra jelentkezés

Tanulófeladat

Bevezetés

Formázás - alapok

A Common Lispben létezik a nyomtató (The Printer) fogalma, amely magában foglalja az összes függvényt, amely Lisp-adatok szöveges reprezentációját írja ki. Egy ilyen függvény a format, amellyel a programozó tetszése szerint formázhatja az adatokat.

A format képességei és általában a Lisp-nyomtatóé hatalmas témakört ölelnek fel; itt a format használatának alapjait írjuk le.

A FORMAT függvény

A format függvény legalább két argumentumot vár: egy streamet, amelyre ír, és egy vezérlő stringet, amely meghatározza, mit és hogyan kell kiírni.

A streamek önálló fogalmat alkotnak, róluk máshol lesz szó. Egyelőre elég annyit tudnod, hogy a kiírás a streamre történik, és ehhez az argumentumhoz két különleges érték tartozik: a t és a nil. A t azt jelenti, hogy a szabványos kimenetre írjon (valójában arra a streamre, amelyhez a *standard-output* változó hozzá van kötve), a nil pedig azt, hogy hozzon létre egy stringet, és adja vissza azt.

Vedd észre, hogy a format mindig nil értékre értékelődik ki, kivéve az utóbbi esetet, amikor a nil van megadva streamként. Ez gyakori módja az egyszerű string-interpolációnak vagy string-összeállításnak.

(format nil "hello world") ; => "hello world"
(format t "hello world")   ; => NIL (but "hello world" is printed to standard output)

Formázási direktívák

A vezérlő string „formázási direktívákat” tartalmazhat, amelyek utasításokat adnak a format számára arról, hogy mit írjon ki, és hogyan értelmezze a többi argumentumot. Bizonyos értelemben a vezérlő string egy program, amelyet a format értelmez és futtat. Minden direktíva ~ jellel kezdődik, amelyet egy karakter követ (pl. ~A, ~D, ~&). A karakter kis- és nagybetűje nem számít.

A legtöbb formázási direktíva egyszerűen beilleszti a format egyik argumentumát a kimenetbe. Ezt úgy mondjuk, hogy „elfogyasztja” az argumentumot. Némelyik direktíva nem fogyaszt argumentumot, vagy egynél többet fogyaszt. Egy direktíva arra is lehetőséget ad, hogy ugrálj az argumentumlistában, vagy kihagyj argumentumokat.

Alapvető formázás

Egy nagyon általános célú formázási direktíva a ~A. Ez az adat „ember által olvasható” változatát írja ki.

(format nil "Value = ~a" 10)                ; => "10"
(format nil "hello ~a" "world")             ; => "hello world"
(format nil "The list is: ~A" (list 1 2 3)) ; => "The list is: (1 2 3)"

Egy másik hasznos formázási direktíva a ~S. Ez az adat „gép által olvasható” változatát írja ki. Ez nagyon hasznos lehet, ha szeretnéd, hogy a létrehozott kimenetet Lisp-adatként lehessen értelmezni. Sok minden esetében ugyanúgy néz ki, mint a ~A, de jegyezd meg, hogy például stringeknél a kimenet tartalmazni fogja az idézőjeleket (másik stringbe ágyazva escape-elve), így az érték visszaolvasható string argumentumként.

(format nil "~s" 10)            ; => "10"
(format nil "~s" "hello world") ; => "\"hello world\""
(format nil "~s" (list 1 2 3))  ; => "(1 2 3)"

Két további nagyon hasznos direktíva a ~% és a ~&. Az előbbi egy újsor karaktert ír ki, az utóbbi viszont egy „friss sort”. A különbség az, hogy a ~% mindig kiír egy újsort, a ~& pedig csak akkor, ha éppen nem egy sor elején állunk. Egyik sem fogyaszt argumentumot.

(format nil "~%new~%lines") ; => "
                                  new
                                  lines"

(format nil "~&new~&lines"  ; => "new
                                  lines"

Végül a ~~ egy egyszerű direktíva, amely egy szó szerinti ~ jelet ír ki.

Utasítások

Mint szinte mindenkinek, akinek munkája van, Laylának, a Lisp-űrlénynek is néha jelentéseket kell készítenie, hogy másokat tájékoztasson. Arra kér, hogy segíts neki formázni azokat az adatokat, amelyek ezekhez a jelentésekhez a rendelkezésére állnak.

1. Negyedéves értékek formázása

Először is Laylának szüksége van egy függvényre: format-quarter-value, amely két paramétert vár: a naptári negyedévet és az értéket, és jelentéshez formázza őket. A függvény kiértékelésének eredménye egy string legyen.

(format-quarter-value "last" 3.14) ; => "The value last quarter: 3.14"
(format-quarter-value "this" 0) ; => "The value this quarter: 0"

2. A két negyedévre vonatkozó jelentés

Layla megköszöni a format-quarter-value függvényt, és azt mondja, hogy nagyon hasznos lesz a következő szükséges függvényben.

A következő jelentésben két negyedév megnevezését és értékét kell két sorban megjeleníteni.

A kimenetnek emellett az első argumentumként megadott folyamba kell mennie.

Például: (format-two-quarters t "last" 3.14 "this" 0) a következőt írja a szabványos kimenetre:


The value last quarter: 3.14
The value this quarter: 0

Ügyelj a körülötte lévő üres sorokra.

3. Emberek és Lisp-űrlények számára olvasható

Layla elfelejtette megemlíteni, hogy a Lisp-űrlények szeretik a Lisp-adatként olvasható formában látni az értékeket. Ezért szükségük van egy új függvényre, amelynek kimenete Lisp-adatként olvasható (ismét a megadott folyamba):

(format-two-quarters-for-reading nil "last" 3.14 "this" 0) ; =>

"(\"The value last quarter: 3.14\" \"The value this quarter: 0\")"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Common Lisp Exercism

Készen állsz elkezdeni a(z) Szolgálatra jelentkezés 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.