Julia Language
Compatibiliteit met meerdere versies
Zoeken…
Syntaxis
- met behulp van Compat
- Compat.String
- Compat.UTF8String
- @compat f. (x, y)
Opmerkingen
Het is soms heel moeilijk om een nieuwe syntax te krijgen om goed te spelen met meerdere versies. Omdat Julia nog steeds actieve ontwikkeling ondergaat, is het vaak handig om de ondersteuning voor oudere versies te laten vallen en zich in plaats daarvan alleen op de nieuwere te richten.
Versienummers
Julia heeft een ingebouwde implementatie van semantische versiebeheer blootgesteld via het type VersionNumber
.
Om een construeren VersionNumber
als een letterlijke, de @v_str
reeks macro kan worden gebruikt:
julia> vers = v"1.2.0"
v"1.2.0"
Als alternatief kan men de VersionNumber
constructor aanroepen; merk op dat de constructor maximaal vijf argumenten accepteert, maar alle behalve de eerste zijn optioneel.
julia> vers2 = VersionNumber(1, 1)
v"1.1.0"
Versienummers kunnen worden vergeleken met behulp van vergelijkingsoperatoren en kunnen dus worden gesorteerd:
julia> vers2 < vers
true
julia> v"1" < v"0"
false
julia> sort([v"1.0.0", v"1.0.0-dev.100", v"1.0.1"])
3-element Array{VersionNumber,1}:
v"1.0.0-dev.100"
v"1.0.0"
v"1.0.1"
Versienummers worden op verschillende plaatsen in Julia gebruikt. De constante VERSION
is bijvoorbeeld een VersionNumber
:
julia> VERSION
v"0.5.0"
Dit wordt meestal gebruikt voor evaluatie van voorwaardelijke codes, afhankelijk van de Julia-versie. Om bijvoorbeeld verschillende code op v0.4 en v0.5 uit te voeren, kan men dat doen
if VERSION < v"0.5"
println("v0.5 prerelease, v0.4 or older")
else
println("v0.5 or newer")
end
Elk geïnstalleerd pakket wordt ook geassocieerd met een actueel versienummer:
julia> Pkg.installed("StatsBase")
v"0.9.0"
Compat.jl gebruiken
Met het Compat.jl-pakket kunnen enkele nieuwe Julia-functies en syntaxis met oudere versies van Julia worden gebruikt. De functies ervan zijn gedocumenteerd in de README, maar hieronder vindt u een overzicht van nuttige toepassingen.
Unified String type
In Julia v0.4 waren er veel verschillende soorten strings . Dit systeem werd als te complex en verwarrend beschouwd, dus in Julia v0.5 blijft er alleen het String
type over. Compat
staat het gebruik van het String
type en de constructor toe op versie 0.4, onder de naam Compat.String
. Bijvoorbeeld deze v0.5-code
buf = IOBuffer()
println(buf, "Hello World!")
String(buf) # "Hello World!\n"
kan direct worden vertaald naar deze code, die werkt op zowel v0.5 als v0.4:
using Compat
buf = IOBuffer()
println(buf, "Hello World!")
Compat.String(buf) # "Hello World!\n"
Merk op dat er enkele kanttekeningen zijn.
- Op v0.4 wordt
Compat.String
getypeerd opByteString
, watUnion{ASCIIString, UTF8String}
. Typen metString
zijn dus niet type-stabiel. In deze situaties wordtCompat.UTF8String
geadviseerd, omdat ditString
op v0.5 enUTF8String
op v0.4 betekent, beide concrete types. - Men moet voorzichtig zijn om
Compat.String
te gebruiken ofimport Compat: String
, omdatString
zelf een betekenis heeft op v0.4: het is een verouderde alias voorAbstractString
. Een teken datString
per ongeluk is gebruikt in plaats vanCompat.String
is als op enig moment de volgende waarschuwingen verschijnen:
WARNING: Base.String is deprecated, use AbstractString instead.
likely near no file:0
WARNING: Base.String is deprecated, use AbstractString instead.
likely near no file:0
Syntaxis voor compacte uitzendingen
Julia v0.5 introduceert syntactische suiker voor broadcast
. De syntaxis
f.(x, y)
wordt verlaagd naar broadcast(f, x, y)
. Voorbeelden van het gebruik van deze syntaxis zijn sin.([1, 2, 3])
om de sinus van meerdere getallen tegelijk te nemen.
Op v0.5 kan de syntaxis direct worden gebruikt:
julia> sin.([1.0, 2.0, 3.0])
3-element Array{Float64,1}:
0.841471
0.909297
0.14112
Als we echter hetzelfde proberen op v0.4, krijgen we een foutmelding:
julia> sin.([1.0, 2.0, 3.0])
ERROR: TypeError: getfield: expected Symbol, got Array{Float64,1}
Gelukkig maakt Compat
deze nieuwe syntax ook bruikbaar vanaf v0.4. Nogmaals, we voegen toe using Compat
. Deze keer omringen we de uitdrukking met de macro @compat
:
julia> using Compat
julia> @compat sin.([1.0, 2.0, 3.0])
3-element Array{Float64,1}:
0.841471
0.909297
0.14112