Lisp (programski jezik) — разлика између измена

Садржај обрисан Садржај додат
Autobot (разговор | доприноси)
м Разне исправке
Нема описа измене
Ред 111:
[[Датотека:Cons-cells.svg|thumb|right|300px|Prikaz liste (42 69 613)]]
 
Lisp lista je jednostruko povezana lista. Svaka ćelija liste se naziva ''kons''<code>cons</code>(od CONStruct cell ili CONStruct list) i sastoji se od dva [[Pokazivač (programiranje)|pokazivača]], koji se nazivaju <code>car</code>(Contents of Address part of Register) i <code>cdr</code>(Contents of Decrement part of Register). Oni, redom, odgovaraju <code>elementu</code> i <code>pokazivaču</code> u [[Povezana lista|povezanoj listi]].
 
Ako uzmemo da nam dati kons<code>cons</code> bude glava povezane liste, onda njegov <code>car</code> pokazivač pokazuje na prvi element liste, a <code>cdr</code> pokazuje na ostatak liste. Iz tog razloga <code>car</code> i <code>cdr</code> funkcije imaju i naziv <code>prvi</code> i <code>ostatak</code> kada se govori o elementima koji su deo povezane liste.
 
Zbog toga što su konsi<code>cons</code> i liste univerzalne u Lisp sistemima, česta je zabluda da su oni jedine strukture podataka u Lisp-u. U stvari, postoje i druge strukture podataka, poput vektora (nizova), heš tabeli...
 
Kons<code>Cons</code> može da se napiše u ''dotted-pair'' notaciji kao <code>(a . b)</code>, gde <code>a</code> predstavlja <code>car</code>, a <code>b</code> predstavlja <code>cdr</code>.
 
==== Funkcije za rad sa listama ====
Ред 131:
</syntaxhighlight>
 
Zbog načina na koji su liste konstruisane pomoću parova konsa, funkcijaFunkcija <code>cons</code> se može iskoristiti za dodavanje na početak liste.
dodavanje na početak liste.
 
<syntaxhighlight lang=Lisp>
Линија 156 ⟶ 155:
==== Deljene strukture ====
 
Lisp liste, koje su jednostruko povezane, mogu da podele strukturu međusobno. To jest, dve liste mogu da imaju isti rep ili krajnji niz konsa<code>cons</code> ćelija. Na primer, nakon izvršenja sledećeg Common Lisp koda
 
<syntaxhighlight lang=Lisp>
Линија 163 ⟶ 162:
</syntaxhighlight>
 
liste <code>foo</code> i <code>bar</code> su <code>(a b c)</code> i <code>(x b c)</code>, redom. Međutim, rep <code>(b c)</code> je ista struktura u obe liste. Nije kopija već kons<code>cons</code> ćelije koje pokazuju na b i c su na istoj memorijskoj lokaciji.
 
Međutim, ukoliko se, u nekom trenutku, zameni b ili c u <code>foo</code>, zameniće se i u <code>bar</code>, što je neočekivani rezultat. Ovo može biti izvor grešaka, pa su funkcije koje menjaju svoje argumente označene kao destruktivne, upravo iz ovog razloga.
upravo iz ovog razloga.
 
=== Samoevaluirajući oblici i operator navođenja quote ===
Линија 197 ⟶ 195:
U jednostavnoj implementaciji Lisp-a, ova struktura u vidu liste je direktno [[Интерпретатор (рачунарство)|interpretirana]] da pokrene program; funkcija je doslovno deo strukture liste koja prevedena od strane interpretatora pri izvršavanju. Većina Lisp sistema sadrži i kompajler. On prevodi strukturu liste na mašinski jezik ili [[Бајткод|bajtkod]] za izvršavanje. Ovaj kod može biti pokrenut jednako brzo kao i u C-u, na primer.
 
MacroiMakroi nude interesantne opcije.
Neke implementacije Lisp-a imaju mehanizam <code>eval-when</code> koji omogućava kodu da bude prisutan za vreme kompilacije (kad zatreba makrou) ali nije prisutan u emitujućem modulu.<ref>[https://www.gnu.org/software/emacs/manual/html_node/cl/Time-of-Evaluation.html Time of Evaluation - Common Lisp Extensions]. Gnu.org. Retrieved on 2013-07-17.</ref>