Valósítsd meg az alapvető listaműveleteket.
Funkcionális nyelvekben az olyan listaműveletek, mint a length, a map és a reduce, nagyon gyakoriak.
Valósíts meg egy sor alapvető listaműveletet anélkül, hogy meglévő függvényeket használnál.
A megvalósítandó műveletek pontos száma és neve kurzustól függ, hogy elkerüljük a meglévő nevekkel való ütközést, de az általad megvalósítandó általános műveletek közé tartoznak:
append (adott két lista, a második lista összes elemét fűzd az első lista végéhez);concatenate (adott egy sor lista, az összes lista minden elemét fűzd össze egyetlen lapos listává);filter (adott egy predikátum és egy lista, add vissza mindazon elemek listáját, amelyekre predicate(item) igaz);length (adott egy lista, add vissza a benne lévő elemek teljes számát);map (adott egy függvény és egy lista, add vissza azoknak az eredményeknek a listáját, amelyeket úgy kapsz, hogy minden elemre alkalmazod a function(item)-et);foldl (adott egy függvény, egy lista és egy kezdő akkumulátor, hajtsd (redukáld) az egyes elemeket balról az akkumulátorba);foldr (adott egy függvény, egy lista és egy kezdő akkumulátor, hajtsd (redukáld) az egyes elemeket jobbról az akkumulátorba);reverse (adott egy lista, add vissza egy listát az összes eredeti elemmel, de fordított sorrendben).Figyelj rá, hogy a fold függvényeknek (foldl, foldr) átadott argumentumok sorrendje nem mindegy.
Ez az első olyan feladat, amellyel találkozunk, ahol a megoldás, amit írunk, nem egy „main” szkript. Egy függvénytárat írunk, amelyet más szkriptekbe source-olunk be, és azok hívják majd meg a függvényeinket.
Ehhez a feladathoz nameref változókra van szükség. Ez legalább 4.0-s bash-verziót igényel. Ha a MacOS alapértelmezett bash-ét használod, telepítened kell egy másik verziót: lásd A bash telepítése
A nameref-ek segítségével egy változót referencia szerint adhatunk át egy függvénynek. Így a változó a függvényben módosítható, és a hívó scope-ban a frissített érték lesz elérhető. Íme egy példa:
prependElements() {
local -n __array=$1
shift
__array=( "$@" "${__array[@]}" )
}
my_array=( a b c )
echo "before: ${my_array[*]}" # => before: a b c
prependElements my_array d e f
echo "after: ${my_array[*]}" # => after: d e f a b c
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Bash nyelvet 97 feladat segítségével, valódi emberi mentorálással, mindez ingyen.
Élvezd a rekurzió gyakorlati bevezetését, fedezd fel a List Ops imperatív és funkcionális alternatíváit, és merülj el a farokhívásos rekurzióban és az akkumulátorfüggvényekben.