A Julia arra biztatja a programozókat, hogy a lehető legtöbb kódot JIT-fordítható függvényekbe szervezzék, és sok kis függvény létrehozása eleve hatékony.
Ez általában sok kicsi, egyszerű függvényt hagy maga után, amelyeket kombinálni kell a nem triviális feladatok elvégzéséhez.
Egy kézenfekvő megközelítés a függvényhívások egymásba ágyazása. A következő példa nagyon erőltetett, de jól szemlélteti a lényeget.
julia> first.(titlecase.(reverse.(["my", "test", "strings"])))
3-element Vector{Char}:
'Y': ASCII/Unicode U+0059 (category Lu: Letter, uppercase)
'T': ASCII/Unicode U+0054 (category Lu: Letter, uppercase)
'S': ASCII/Unicode U+0053 (category Lu: Letter, uppercase)
Ennek a megközelítésnek a hátránya, hogy az olvashatóság gyorsan romlik, ahogy a beágyazás egyre mélyebb lesz.
Egyszerűbb és rugalmasabb megközelítésre van szükségünk.
Ez a matematikusok kedvelt technikája, és a Julia átveszi a matematikai szintaxist.
Tetszőleges számú függvény composed ∘ operátorokkal kapcsolható össze (a ∘ beírása: \circ, majd tab).
Az eredmény egyetlen függvényként használható.
julia> compfunc = first ∘ titlecase ∘ reverse
first ∘ titlecase ∘ reverse
julia> compfunc.(["my", "test", "strings"])
3-element Vector{Char}:
'Y': ASCII/Unicode U+0059 (category Lu: Letter, uppercase)
'T': ASCII/Unicode U+0054 (category Lu: Letter, uppercase)
'S': ASCII/Unicode U+0053 (category Lu: Letter, uppercase)
# alternative syntax, giving the same result
julia> (first ∘ titlecase ∘ reverse).(["my", "test", "strings"])
Néhány dolgot érdemes megjegyezni:
Egy alternatíva a programozók megközelítéseként is felfogható, szemben a matematikusokéval.
A Pipelines régóta használatosak Unix shell szkriptekben, és az utóbbi időben népszerűvé váltak a mainstream programozási nyelvekben (az F#-nak néha tulajdonítják, hogy úttörő szerepet játszott elterjedésükben).
Az alapkoncepció: indulj ki valamilyen adatból, majd vezesd át egy függvénysorozaton, hogy megkapd az eredményt.
A pipe operátor a |> (mint az F#-ban és az R újabb verzióiban), bár a Juliának van egy broadcast változata is: .|>.
julia> ["my", "test", "strings"] .|> reverse .|> titlecase .|> first
3-element Vector{Char}:
'Y': ASCII/Unicode U+0059 (category Lu: Letter, uppercase)
'T': ASCII/Unicode U+0054 (category Lu: Letter, uppercase)
'S': ASCII/Unicode U+0053 (category Lu: Letter, uppercase)
A végrehajtás most szigorúan balról jobbra halad, és az egyes függvények kimenete a nyíl irányában áramlik, hogy a következő függvény bemenetévé váljon.
Nem véletlen, hogy a kompozíció és a pipeline szemléltetésére használt függvények mind egyetlen argumentumot várnak.
Néhány tisztán funkcionális nyelv az első argumentumot fűzi be egy függvénybe, de a többit is engedi szerepeltetni.
Ezzel szemben a Julia egy pipeline-ban csak a függvények neveit (vagy valami egyenértékűt) várja, további argumentumok nélkül.
Ennek fontos technikai okai vannak (összefügg azzal, hogy a currying nem része szabványosan a nyelv tervezésének).
A sok embernek, aki nem érti a curryingot, egyszerűen el kell fogadnia, hogy ez a korlátozás nem gondatlan mulasztás, és valószínűleg nem fog változni a jövőbeli Julia-verziókban.
Olyan egyargumentumos függvényekre van szükségünk, amelyek elvégzik, amire éppen szükség van. Szerencsére új függvényeket könnyű definiálni a Juliában.
A legegyszerűbb, ha anonymous function-t használunk.
Például ha van egy bemeneti stringünk, és alulvonások mentén szeretnénk felosztani:
julia> "my_test_strings" |> (s -> split(s, '_'))
3-element Vector{SubString{String}}:
"my"
"test"
"strings"
Ezt a vektort aztán tovább lehet fűzni más függvényekhez, mint korábban.
A névtelen függvény zárójelbe tétele ebben az esetben opcionális, de általában hasznos módja a kétértelműség csökkentésének.
Ugyanígy létrehozhatunk egy névvel ellátott függvényt korábban a programban, és szükség szerint újra felhasználhatjuk.
Ebben a feladatban középiskolás szerelmespároknak segítesz szerelmet vallani a közösségi médiában azzal, hogy unicode szívet generálsz a kezdőbetűikből:
❤ J. + M. ❤
Valósítsd meg a cleanupname metódust.
Ez kap egy nevet, eltávolít belőle minden - karaktert, és szóközre cseréli őket.
A név elejéről és végéről is eltávolít minden whitespace-t.
julia> cleanupname("Jane-Ann")
"Jane Ann"
Valósítsd meg a firstletter metódust.
Ez kap egy nevet, és visszaadja annak első betűjét stringként.
Ügyelj rá, hogy újrahasználd a korábbi lépésben definiált cleanupname-t, és más függvényekkel komponálva építsd fel.
julia> firstletter("Jane")
"J"
Valósítsd meg az initial metódust.
Ez kap egy nevet, és visszaadja annak első betűjét nagybetűvel, egy ponttal a végén.
Ügyelj rá, hogy újrahasználd a korábbi lépésben definiált firstletter-t.
initial("Robert")
"R."
Valósítsd meg a couple metódust.
Ez két nevet kap, és az iniciálékat emoji szívekkel körbevéve adja vissza.
Ügyelj rá, hogy újrahasználd a korábbi lépésben definiált initial-t.
couple("Blake Miller", "Riley Lewis")
"❤ B. + R. ❤"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.