Nevýhody

V programování jsou nevýhody (/ˈkɒnz/ nebo /ˈkɒns/) základním rysem ve většině dialektů programovacího jazyka Lisp . cons vytváří paměťové objekty, které obsahují dvě hodnoty nebo dva ukazatele na hodnoty [1] . Název funkce vznikl jako zkratka slova cons truct , tedy konstrukce. To znamenalo, že cons vytvoří nový objekt v paměti ze stávajících dvou. Tyto objekty se také nazývají cons cells, cons, neatomové S-exprese ("NATS") nebo cons pairs. V angličtině, v žargonu LISP programátorů, se slovo cons používá také jako sloveso. Výraz "to cons x na y " je ekvivalentní "vytvořit nový objekt pomocí následujícího kódu: ". (cons x y)

Mezi uživateli funkcionálních programovacích jazyků a v souvislosti s prací se seznamy se „cons“ používá také jako slangový výraz pro operátory podobného účelu podobného účelu, které se píší zcela odlišně. Dobrými příklady jsou operátory :: v ML , Scala , F# a Elm nebo operátor : v Haskel l, které přidávají prvek na začátek seznamu.

Použití

Přestože buňky záporů lze použít k ukládání uspořádaných párů dat, častěji se používají k vytváření složitějších složených datových struktur, jako jsou seznamy a binární stromy .

Objednané páry

Například exprese Lisp (cons 1 2) vytváří buňku obsahující 1 ve své levé polovině (nazývané pole auta) a 2 ve své pravé polovině (pole cdr). V zápisu Lisp vypadá hodnota (proti 1 2) takto:

(12)

Všimněte si tečky mezi 1 a 2; to znamená, že S-výraz je "tečka" (tzv. "cons-pair") a ne "seznam".

Seznamy

V Lisp jsou seznamy implementovány nad páry nevýhod. Přesněji řečeno, struktura jakéhokoli seznamu v Lisp vypadá takto:

  1. Prázdný seznam, označený jako (), je speciální objekt. To je také obyčejně odkazoval se na jak nula .
  2. Jednoprvkový seznam je pár cons, jehož první buňka obsahuje jeho jediný prvek a druhá buňka odkazuje na nulu.
  3. Seznam dvou nebo více prvků je cons-pair, přičemž první prvek je prvním prvkem seznamu a druhý odkazuje na seznam, který je na konci hlavního seznamu.

Zobrazený pohled je nejjednodušší formou jednoduše propojeného seznamu, s jehož obsahem lze snadno manipulovat pomocí příkazů cons, car , cdr . Představte si například seznam s prvky 1, 2 a 3. Takový seznam lze vytvořit ve třech krocích:

nevýhody (3 nula) Nevýhody (2 výsledky předchozí operace) Nevýhody (1 výsledek předchozí operace)

nebo totéž, v jednom výrazu:

( nevýhody 1 ( nevýhody 2 ( nevýhody 3 nula )))

stejná sekvence záporných operací je zkrácena:

( seznam 1 2 3 )

jako výsledek vytvoříme seznam:

(1. (2. (3. nula)))

s následující strukturou:

*--*--*--nula | | | 1 2 3

lze to zkrátit takto:

(1 2 3)

Na základě výše uvedeného lze nevýhody použít k přidání nového prvku do popředí existujícího propojeného seznamu. Pokud je například x seznam, který jsme definovali výše, pak (proti 5 x) vytvoří seznam:

(5 1 2 3)

Stromy

Binární stromy , které ukládají data pouze do svých listů, lze také snadno implementovat pomocí nevýhod. Příklad:

( nevýhody ( nevýhody 1 2 ) ( nevýhody 3 4 ))

vytvoří seznamovou reprezentaci stromu:

((1. 2) . (3. 4))

to je

* / \ ** / \ / \ 1 2 3 4

Technicky je seznam (1 2 3) v předchozím příkladu také nevyváženým binárním stromem. Abychom to ověřili, jednoduše překreslíme schéma

*--*--*--nula | | | 1 2 3

na ekvivalent:

* / \ jeden * / \ 2 * / \ 3 nuly

Funkční implementace

Protože Lisp obsahuje funkce první třídy , všechny datové struktury, včetně záporných buněk, lze implementovat pomocí funkcí. Příklad v jazyce schématu :

( definovat ( cons x y ) ( lambda ( m ) ( m x y ))) ( definovat ( auto z ) ( z ( lambda ( p q ) p ))) ( definovat ( cdr z ) ( z ( lambda ( p q ) ) q )))

Tato technika je známá jako " Církevní kódování ". Umožňuje vám přepsat implementaci operací cons , car a cdr pomocí „buňek záporů“. Církevní kódování je běžný způsob, jak definovat datové struktury v čistém lambda počtu .

Taková implementace, i když je akademicky zajímavá, je nepraktická, protože činí záporné buňky nerozeznatelné od jakékoli jiné procedury schématu a zavádí zbytečnou výpočetní neefektivnost. Stejný přístup však lze použít pro složitější algebraické datové typy s variantami . V tomto případě může být skutečně efektivnější než jiné způsoby reprezentace dat v paměti [2] .

Viz také

Odkazy

  • SDRAW , Common Lisp kód pro kreslení datových struktur tvořených zápornými buňkami. Autor: David S. Touretzky.

Poznámky

  1. E.I. Bolshakova, N. V. Gruzdeva. Základy programování v Lisp. - Moskva: Vydavatelské oddělení fakulty CMC Moskevské státní univerzity pojmenované po M. V. Lomonosovovi; MAKS Press, 2010, 2010.
  2. Archivovaná kopie (downlink) . Získáno 1. března 2009. Archivováno z originálu 31. března 2010.