A bináris adatokkal való munka trükkös lehet, ezért a Gleam egy BitArray típust és a hozzá tartozó szintaxist kínálja, amellyel bináris adatokat hozhatsz létre, és mintaillesztést végezhetsz rajtuk.
A bittömb-literálokat a <<>> szintaxissal definiálod. A bittömb-literál szegmensekből épül fel. Minden szegmens egy értékből és egy annotációból áll, amelyeket : választ el. Az annotáció megadja, hogy hány bit kódolja az értéket, és teljesen el is hagyható, ilyenkor alapértelmezés szerint 8 bites egész szám lesz.
// This defines a bit array with three segments of a single bit each
<<0:1, 1:1, 0:1>>
// This defines a bit array with three segments of 8 bits each
<<0, 1, 0>>
A :1 típusmegadás a :size(1) írásmód rövidítése. A hosszabb szintaxist akkor kell használnod, ha a bitméret egy változóból származik.
let segment_size = 1
<<0:size(segment_size), 1:size(segment_size), 0:size(segment_size)>>
A bináris egész literálokat közvetlenül kettes számrendszerben is leírhatod, ha a literál elé 0b-t teszel. Ne feledd, hogy a tesztekben vagy a programodban kiíratva tízes számrendszerű számként jelennek meg.
<<0b1011:4>> == <<11:4>>
// -> True
Ha a szegmens értéke túllépi a szegmens típusának kapacitását, akkor balról csonkolódik.
<<0b1011:3>> == <<0b0011:3>>
// -> True
Egy meglévő bittömb elé és mögé is fűzhetsz a bittömb-szintaxissal. A meglévő bittömbnél a :bits annotációt kell használnod.
let value = <<0b110:3, 0b001:3>>
let new_value = <<0b011:3, value:bits, 0b000:3>>
// -> <<120, 8:size(4)>>
A változókban tárolt bittömböket a bittömb-szintaxissal fűzhetjük össze. Két változó méretű bittömb összefűzésénél a :bits annotációt kell használni.
let first = <<0b110:3>>
let second = <<0b001:3>>
let concatenated = <<first:bits, second:bits>>
// -> <<49:size(6)>>
Mintaillesztéssel értékeket is kinyerhetsz a bittömbből. Ehhez ismerned kell az egyes rögzíteni kívánt szegmensek bitszámát, egyetlen kivétellel: a :bits annotációval ismeretlen méretű bittömbön is végezhetsz mintaillesztést, de ezt csak az utolsó szegmensnél használhatod.
let assert <<value:4, rest:bits>> = <<0b01101001:8>>
value == 0b0110
// -> True
Lehet, hogy a bittömbök más formátumban jelennek meg, mint amilyenben létrehoztad őket. Ez a bittömbök tanulása közben gyakran okoz zavart.
Alapértelmezés szerint a bittömbök 8 bites szegmensekben (azaz bájtokban) jelennek meg, akkor is, ha más méretű szegmensekkel hoztad létre őket.
<<2011:11>>
// -> <<251, 3:size(3)>>
Ha olyan bittömböt hozol létre, amely egy nyomtatható, UTF-8-kódolású stringet reprezentál, előfordulhat, hogy az olyan függvények, mint az io.debug, stringként jelenítik meg. Ez a Gleam belső string-reprezentációjának egyik megvalósítási részlete miatt van így.
<<>>
// -> ""
<<65, 66, 67>>
// -> "ABC"
A DNS-kutatólaborodban már többféle módszert is kipróbáltál, hogy tömörítsd a kutatási adataidat és tárolóhelyet spórolj. Az egyik kollégád azt javasolja, hogy alakítsd át a DNS-adatokat bináris reprezentációvá:
| Nukleinsav | Kód |
|---|---|
| Adenine | 00 |
| Cytosine | 01 |
| Guanine | 10 |
| Thymine | 11 |
Elgondolkodsz rajta, hiszen ez csökkentheti a szükséges adattárolási költségeket, igaz, az emberi olvashatóság rovására. Úgy döntesz, hogy írsz egy modult az adataid kódolásához és dekódolásához, hogy felmérd a megtakarítást.
Valósítsd meg az encode_nucleotide függvényt, amely átvesz egy nukleotidot, és visszaadja a kódolt kód int értékét.
encode_nucleotide(Cytosine)
// -> 1
// (which is equal to 0b01)
Valósítsd meg a decode_nucleotide függvényt, amely átveszi a kódolt kód egész értékét, és visszaadja a nukleotidot.
decode_nucleotide(0b01)
// -> Ok(Cytosine)
Valósítsd meg az encode függvényt, amely átvesz egy nukleotidlistát, és visszaad egy bittömböt a kódolt adatokból.
encode([Adenine, Cytosine, Guanine, Thymine])
// -> <<27>>
Valósítsd meg a decode függvényt, amely átvesz egy nukleinsavat reprezentáló bittömböt, és nukleotidok listájaként visszaadja a dekódolt adatokat.
decode(<<27>>)
// -> Ok([Adenine, Cytosine, Guanine, Thymine])
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Gleam nyelvet 33 fogalom122 feladat segítségével, valódi emberi mentorálással, mindez ingyen.