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.
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 .
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".
V Lisp jsou seznamy implementovány nad páry nevýhod. Přesněji řečeno, struktura jakéhokoli seznamu v Lisp vypadá takto:
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 3lze 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)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 4Technicky 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 3na ekvivalent:
* / \ jeden * / \ 2 * / \ 3 nulyProtož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] .
Typy dat | |
---|---|
Neinterpretovatelné | |
Numerický | |
Text | |
Odkaz | |
Kompozitní | |
abstraktní | |
jiný | |
související témata |