Julia Language
Uitdrukkingen
Zoeken…
Inleiding tot uitdrukkingen
Uitdrukkingen zijn een specifiek type object in Julia. U kunt denken dat een uitdrukking een stuk Julia-code vertegenwoordigt dat nog niet is geëvalueerd (dwz uitgevoerd). Er zijn dan specifieke functies en bewerkingen, zoals eval()
die de uitdrukking evalueren.
We kunnen bijvoorbeeld een script schrijven of de volgende tolk invoeren: julia> 1 + 1 2
Een manier om een uitdrukking te maken is met behulp van de :()
syntaxis. Bijvoorbeeld:
julia> MyExpression = :(1+1)
:(1 + 1)
julia> typeof(MyExpression)
Expr
We hebben nu een Expr
type object. Het is net gevormd en doet niets - het blijft gewoon rondhangen als elk ander object totdat er iets op wordt gedaan. In dit geval kunnen we die uitdrukking evalueren met de functie eval()
:
julia> eval(MyExpression)
2
We zien dus dat de volgende twee gelijkwaardig zijn:
1+1
eval(:(1+1))
Waarom zouden we door de veel gecompliceerdere syntaxis in eval(:(1+1))
als we gewoon willen vinden wat 1 + 1 gelijk is? De basisreden is dat we een uitdrukking op een bepaald punt in onze code kunnen definiëren, deze mogelijk later kunnen wijzigen en deze op een later tijdstip nog kunnen evalueren. Dit kan mogelijk krachtige nieuwe mogelijkheden bieden voor de Julia-programmeur. Expressies zijn een belangrijk onderdeel van metaprogrammering in Julia.
Uitdrukkingen maken
Er zijn een aantal verschillende methoden die kunnen worden gebruikt om hetzelfde type expressie te maken. De uitdrukkingen intro vermeldden de :()
syntaxis. Misschien is de beste plaats om te beginnen, echter met strijkers. Dit helpt om enkele van de fundamentele overeenkomsten tussen uitdrukkingen en tekenreeksen in Julia te onthullen.
Creëer expressie van string
Uit de Julia- documentatie :
Elk Julia-programma begint het leven als een string
Met andere woorden, elk Julia-script wordt eenvoudig geschreven in een tekstbestand, dat niets anders is dan een reeks tekens. Evenzo is elk Julia-commando dat in een tolk wordt ingevoerd slechts een reeks tekens. De rol van Julia of een andere programmeertaal is dan om tekenreeksen op een logische, voorspelbare manier te interpreteren en evalueren, zodat die tekenreeksen kunnen worden gebruikt om te beschrijven wat de programmeur wil dat de computer bereikt.
Een manier om een uitdrukking te maken is dus om de functie parse()
te gebruiken zoals toegepast op een tekenreeks. De volgende uitdrukking zal, zodra deze is geëvalueerd, de waarde 2 toekennen aan het symbool x
.
MyStr = "x = 2"
MyExpr = parse(MyStr)
julia> x
ERROR: UndefVarError: x not defined
eval(MyExpr)
julia> x
2
Maak een expressie met :()
Syntaxis
MyExpr2 = :(x = 2)
julia> MyExpr == MyExpr2
true
Let op: met deze syntaxis behandelt Julia automatisch de namen van objecten als verwijzingen naar symbolen. We kunnen dit zien als we kijken naar de args
van de uitdrukking. (Zie Expression Fields of Expression Objects voor meer informatie over het veld args
in een expressie.)
julia> MyExpr2.args
2-element Array{Any,1}:
:x
2
Maak expressie met de functie Expr()
MyExpr3 = Expr(:(=), :x, 2)
MyExpr3 == MyExpr
Deze syntaxis is gebaseerd op voorvoegselnotatie . Met andere woorden, het eerste argument van de opgegeven functie voor de functie Expr()
is de head
of het voorvoegsel. De overige zijn de arguments
van de uitdrukking. Het head
bepaalt welke bewerkingen op de argumenten worden uitgevoerd.
Zie Fields of Expression Objects voor meer informatie hierover
Bij het gebruik van deze syntaxis is het belangrijk om onderscheid te maken tussen het gebruik van objecten en symbolen voor objecten. In het bovenstaande voorbeeld kent de uitdrukking bijvoorbeeld de waarde 2
aan het symbool :x
, een volkomen verstandige bewerking. Als we x
zelf in een dergelijke uitdrukking zouden gebruiken, zouden we het onzinnige resultaat krijgen:
julia> Expr(:(=), x, 5)
:(2 = 5)
Evenzo, als we de args
onderzoeken, zien we:
julia> Expr(:(=), x, 5).args
2-element Array{Any,1}:
2
5
De functie Expr()
voert dus niet dezelfde automatische transformatie naar symbolen uit als de syntaxis :()
voor het maken van expressies.
Maak expressies met meerdere regels met quote...end
MyQuote =
quote
x = 2
y = 3
end
julia> typeof(MyQuote)
Expr
Merk op dat we met quote...end
uitdrukkingen kunnen maken die andere uitdrukkingen in hun args
veld bevatten:
julia> typeof(MyQuote.args[2])
Expr
Zie Expression Fields of Expression Objects voor meer informatie over dit args
veld.
Meer over het maken van expressies
Dit voorbeeld geeft alleen de basis voor het maken van expressies. Zie ook bijvoorbeeld Interpolatie en expressies en Velden met expressie-objecten voor meer informatie over het maken van complexere en geavanceerde expressies.
Velden van expressieobjecten
Zoals vermeld in de inleiding tot uitdrukkingen zijn uitdrukkingen een specifiek type object in Julia. Als zodanig hebben ze velden. De twee meest gebruikte velden van een uitdrukking zijn de head
en de args
. Overweeg bijvoorbeeld de uitdrukking
MyExpr3 = Expr(:(=), :x, 2)
besproken in Expressies maken . We kunnen het head
en de args
als volgt zien:
julia> MyExpr3.head
:(=)
julia> MyExpr3.args
2-element Array{Any,1}:
:x
2
Uitdrukkingen zijn gebaseerd op voorvoegselnotatie . Als zodanig specificeert de head
algemeen de bewerking die moet worden uitgevoerd op de args
. Het hoofd moet van Julia type Symbol
.
Wanneer een uitdrukking een waarde moet toekennen (wanneer deze wordt geëvalueerd), zal deze over het algemeen een kop gebruiken van :(=)
. Er zijn natuurlijk duidelijke variaties hierop die kunnen worden gebruikt, bijvoorbeeld:
ex1 = Expr(:(+=), :x, 2)
: oproep voor expressiehoofden
Een ander veel voorkomend head
voor uitdrukkingen is :call
. Eg
ex2 = Expr(:call, :(*), 2, 3)
eval(ex2) ## 6
Volgens de conventies van prefixnotatie worden operators van links naar rechts geëvalueerd. Deze uitdrukking betekent hier dus dat we de functie aanroepen die is opgegeven voor het eerste element van args
voor de volgende elementen. We zouden op dezelfde manier kunnen hebben:
julia> ex2a = Expr(:call, :(-), 1, 2, 3)
:(1 - 2 - 3)
Of andere, mogelijk interessantere functies, bijv
julia> ex2b = Expr(:call, :rand, 2,2)
:(rand(2,2))
julia> eval(ex2b)
2x2 Array{Float64,2}:
0.429397 0.164478
0.104994 0.675745
Automatische bepaling van het head
bij gebruik van :()
notatie voor het maken van een uitdrukking
Merk op dat :call
impliciet wordt gebruikt als het hoofd in bepaalde constructies van uitdrukkingen, bijv
julia> :(x + 2).head
:call
Met de syntaxis :()
voor het maken van expressies zal Julia dus proberen automatisch de juiste te gebruiken kop te bepalen. Op dezelfde manier:
julia> :(x = 2).head
:(=)
Als u niet zeker weet wat u moet gebruiken voor een expressie die u bijvoorbeeld gebruikt, bijvoorbeeld Expr()
, kan dit een handig hulpmiddel zijn om tips en ideeën te krijgen over wat u moet gebruiken.
Interpolatie en uitdrukkingen
Het maken van uitdrukkingen vermeldt dat uitdrukkingen nauw verwant zijn aan tekenreeksen. Als zodanig zijn de principes van interpolatie binnen strings ook relevant voor Expressies. In de basisreeksinterpolatie kunnen we bijvoorbeeld iets hebben als:
n = 2
julia> MyString = "there are $n ducks"
"there are 2 ducks"
We gebruiken het $
-teken om de waarde van n
in de string in te voegen. We kunnen dezelfde techniek gebruiken met uitdrukkingen. Eg
a = 2
ex1 = :(x = 2*$a) ## :(x = 2 * 2)
a = 3
eval(ex1)
x # 4
Vergelijk dit dit:
a = 2
ex2 = :(x = 2*a) # :(x = 2a)
a = 3
eval(ex2)
x # 6
Met het eerste voorbeeld stellen we dus van tevoren de waarde in van a
die zal worden gebruikt op het moment dat de uitdrukking wordt geëvalueerd. Met het tweede voorbeeld zal de Julia-compiler echter alleen kijken naar a
om de waarde ervan te vinden op het moment van evaluatie voor onze expressie.
Externe verwijzingen naar uitdrukkingen
Er zijn een aantal nuttige webbronnen die je kennis van uitdrukkingen in Julia verder kunnen helpen. Waaronder:
- Julia Docs - Metaprogrammering
- Wikibooks - Julia Metaprogramming
- Julia's macro's, uitdrukkingen, etc. voor en door de verwarde, door Gray Calhoun
- Month of Julia - Metaprogramming, door Andrew Collier
- Symbolische differentiatie in Julia, door John Myles White
SO-berichten:
- Wat is een "symbool" in Julia? Antwoord van Stefan Karpinski
- Waarom drukt Julia deze uitdrukking op deze complexe manier uit?
- Verklaring van het voorbeeld van Julia-expressie-interpolatie