Essentials
Introduction
Julia Base contient une gamme de fonctions et de macros appropriées pour effectuer des calculs scientifiques et numériques, mais est également aussi vaste que celles de nombreux langages de programmation à usage général. Une fonctionnalité supplémentaire est disponible à partir d'une collection croissante de available packages. Les fonctions sont regroupées par sujet ci-dessous.
Quelques notes générales :
- Pour utiliser les fonctions du module, utilisez
import Modulepour importer le module, etModule.fn(x)pour utiliser les fonctions. - Alternativement,
using Moduleimportera toutes les fonctions exportées deModuledans l'espace de noms actuel. - Par convention, les noms de fonction se terminant par un point d'exclamation (
!) modifient leurs arguments. Certaines fonctions ont à la fois des versions modifiant (par exemple,sort!) et non modifiant (sort).
Le comportement de Base et des bibliothèques standard est stable tel que défini dans SemVer uniquement s'il est documenté ; c'est-à-dire inclus dans le Julia documentation et non marqué comme instable. Voir API FAQ pour plus d'informations.
Getting Around
Base.exit — Functionexit(code=0)Arrêtez le programme avec un code de sortie. Le code de sortie par défaut est zéro, indiquant que le programme s'est terminé avec succès. Dans une session interactive, exit() peut être appelé avec le raccourci clavier ^D.
Base.atexit — Functionatexit(f)Enregistre une fonction f() à zéro ou un argument qui sera appelée à la sortie du processus. Les hooks atexit() sont appelés dans l'ordre dernier entré, premier sorti (LIFO) et s'exécutent avant les finaliseurs d'objet.
Si f a une méthode définie pour un argument entier, elle sera appelée comme f(n::Int32), où n est le code de sortie actuel, sinon elle sera appelée comme f().
La forme à un argument nécessite Julia 1.9
Les hooks de sortie sont autorisés à appeler exit(n), auquel cas Julia sortira avec le code de sortie n (au lieu du code de sortie original). Si plus d'un hook de sortie appelle exit(n), alors Julia sortira avec le code de sortie correspondant au dernier hook de sortie appelé qui appelle exit(n). (Parce que les hooks de sortie sont appelés dans l'ordre LIFO, "dernier appelé" est équivalent à "premier enregistré".)
Remarque : Une fois que tous les hooks de sortie ont été appelés, aucun autre hook de sortie ne peut être enregistré, et tout appel à atexit(f) après que tous les hooks ont été complétés lancera une exception. Cette situation peut se produire si vous enregistrez des hooks de sortie à partir de Tâches en arrière-plan qui peuvent encore s'exécuter de manière concurrente pendant l'arrêt.
Base.isinteractive — Functionisinteractive() -> BoolDéterminez si Julia s'exécute dans une session interactive.
Base.summarysize — FunctionBase.summarysize(obj; exclude=Union{...}, chargeall=Union{...}) -> IntCalcule la quantité de mémoire, en octets, utilisée par tous les objets uniques accessibles à partir de l'argument.
Arguments Clés
exclude: spécifie les types d'objets à exclure de la traversée.chargeall: spécifie les types d'objets pour lesquels il faut toujours prendre en compte la taille de tous leurs champs, même si ces champs seraient normalement exclus.
Voir aussi sizeof.
Exemples
julia> Base.summarysize(1.0)
8
julia> Base.summarysize(Ref(rand(100)))
848
julia> sizeof(Ref(rand(100)))
8Base.__precompile__ — Function__precompile__(isprecompilable::Bool)Spécifiez si le fichier appelant cette fonction est précompilable, par défaut true. Si un module ou un fichier n'est pas sûr de pouvoir être précompilé, il doit appeler __precompile__(false) afin de générer une erreur si Julia tente de le précompiler.
Base.include — FunctionBase.include([mapexpr::Function,] m::Module, path::AbstractString)Évalue le contenu du fichier source d'entrée dans le scope global du module m. Chaque module (sauf ceux définis avec baremodule) a sa propre définition de include omettant l'argument m, qui évalue le fichier dans ce module. Renvoie le résultat de la dernière expression évaluée du fichier d'entrée. Lors de l'inclusion, un chemin d'inclusion local à la tâche est défini sur le répertoire contenant le fichier. Les appels imbriqués à include rechercheront par rapport à ce chemin. Cette fonction est généralement utilisée pour charger le code source de manière interactive, ou pour combiner des fichiers dans des packages qui sont divisés en plusieurs fichiers source.
L'argument optionnel mapexpr peut être utilisé pour transformer le code inclus avant qu'il ne soit évalué : pour chaque expression analysée expr dans path, la fonction include évalue en réalité mapexpr(expr). Si elle est omise, mapexpr par défaut à identity.
Julia 1.5 est requise pour passer l'argument mapexpr.
include — Functioninclude([mapexpr::Function,] path::AbstractString)Évalue le contenu du fichier source d'entrée dans le scope global du module contenant. Chaque module (sauf ceux définis avec baremodule) a sa propre définition de include, qui évalue le fichier dans ce module. Renvoie le résultat de la dernière expression évaluée du fichier d'entrée. Lors de l'inclusion, un chemin d'inclusion local à la tâche est défini sur le répertoire contenant le fichier. Les appels imbriqués à include rechercheront par rapport à ce chemin. Cette fonction est généralement utilisée pour charger du code source de manière interactive, ou pour combiner des fichiers dans des packages qui sont divisés en plusieurs fichiers source. L'argument path est normalisé à l'aide de normpath qui résoudra les tokens de chemin relatifs tels que .. et convertira / en le séparateur de chemin approprié.
L'argument optionnel mapexpr peut être utilisé pour transformer le code inclus avant qu'il ne soit évalué : pour chaque expression analysée expr dans path, la fonction include évalue en réalité mapexpr(expr). S'il est omis, mapexpr par défaut à identity.
Utilisez Base.include pour évaluer un fichier dans un autre module.
Julia 1.5 est requise pour passer l'argument mapexpr.
Base.include_string — Functioninclude_string([mapexpr::Function,] m::Module, code::AbstractString, filename::AbstractString="string")Comme include, sauf qu'il lit le code à partir de la chaîne donnée plutôt qu'à partir d'un fichier.
L'argument optionnel mapexpr peut être utilisé pour transformer le code inclus avant qu'il ne soit évalué : pour chaque expression analysée expr dans code, la fonction include_string évalue en réalité mapexpr(expr). S'il est omis, mapexpr par défaut à identity.
Julia 1.5 est requis pour passer l'argument mapexpr.
Base.include_dependency — Functioninclude_dependency(path::AbstractString; track_content::Bool=true)Dans un module, déclarez que le fichier, le répertoire ou le lien symbolique spécifié par path (relatif ou absolu) est une dépendance pour la précompilation ; c'est-à-dire que si track_content=true, le module devra être recompilé si le contenu de path change (si path est un répertoire, le contenu équivaut à join(readdir(path))). Si track_content=false, la recompilation est déclenchée lorsque le temps de modification mtime de path change.
Cela n'est nécessaire que si votre module dépend d'un chemin qui n'est pas utilisé via include. Cela n'a aucun effet en dehors de la compilation.
L'argument clé track_content nécessite au moins Julia 1.11. Une erreur est maintenant lancée si path n'est pas lisible.
__init__ — Keyword__init__La fonction __init__() dans un module s'exécute immédiatement après que le module soit chargé à l'exécution pour la première fois. Elle est appelée une fois, après que toutes les autres instructions dans le module ont été exécutées. Comme elle est appelée après l'importation complète du module, les fonctions __init__ des sous-modules seront exécutées en premier. Deux utilisations typiques de __init__ sont l'appel de fonctions d'initialisation à l'exécution de bibliothèques C externes et l'initialisation de constantes globales qui impliquent des pointeurs retournés par des bibliothèques externes. Voir la section du manuel sur les modules pour plus de détails.
Exemples
const foo_data_ptr = Ref{Ptr{Cvoid}}(0)
function __init__()
ccall((:foo_init, :libfoo), Cvoid, ())
foo_data_ptr[] = ccall((:foo_data, :libfoo), Ptr{Cvoid}, ())
nothing
endBase.which — Methodwhich(f, types)Renvoie la méthode de f (un objet Method) qui serait appelée pour des arguments des types donnés.
Si types est un type abstrait, alors la méthode qui serait appelée par invoke est renvoyée.
Voir aussi : parentmodule, @which, et @edit.
Base.methods — Functionmethods(f, [types], [module])Retourne la table des méthodes pour f.
Si types est spécifié, retourne un tableau de méthodes dont les types correspondent. Si module est spécifié, retourne un tableau de méthodes définies dans ce module. Une liste de modules peut également être spécifiée sous forme de tableau.
Au moins Julia 1.4 est requis pour spécifier un module.
Voir aussi : which, @which et methodswith.
Base.@show — Macro@show exs...Affiche une ou plusieurs expressions, ainsi que leurs résultats, sur stdout, et renvoie le dernier résultat.
Voir aussi : show, @info, println.
Exemples
julia> x = @show 1+2
1 + 2 = 3
3
julia> @show x^2 x/2;
x ^ 2 = 9
x / 2 = 1.5Base.MainInclude.ans — ConstantansUne variable faisant référence à la dernière valeur calculée, importée automatiquement dans l'invite interactive.
Base.MainInclude.err — ConstanterrUne variable faisant référence aux dernières erreurs levées, automatiquement importée dans l'invite interactive. Les erreurs levées sont collectées dans une pile d'exceptions.
Base.active_project — Functionactive_project()Renvoie le chemin du fichier Project.toml actif. Voir aussi Base.set_active_project.
Base.set_active_project — Functionset_active_project(projfile::Union{AbstractString,Nothing})Définissez le fichier Project.toml actif sur projfile. Voir aussi Base.active_project.
Cette fonction nécessite au moins Julia 1.8.
Keywords
Voici la liste des mots-clés réservés en Julia : baremodule, begin, break, catch, const, continue, do, else, elseif, end, export, false, finally, for, function, global, if, import, let, local, macro, module, quote, return, struct, true, try, using, while. Ces mots-clés ne peuvent pas être utilisés comme noms de variables.
Les deux séquences de mots suivantes sont réservées : abstract type, mutable struct, primitive type. Cependant, vous pouvez créer des variables avec les noms : abstract, mutable, primitive et type.
Enfin : where est analysé comme un opérateur infixe pour écrire des définitions de méthodes et de types paramétriques ; in et isa sont analysés comme des opérateurs infixes ; public est analysé comme un mot-clé lorsqu'il commence une déclaration de niveau supérieur ; outer est analysé comme un mot-clé lorsqu'il est utilisé pour modifier la portée d'une variable dans une spécification d'itération d'une boucle for ; et as est utilisé comme un mot-clé pour renommer un identifiant introduit dans la portée par import ou using. La création de variables nommées where, in, isa, outer et as est cependant autorisée.
module — Keywordmodulemodule déclare un Module, qui est un espace de travail de variables globales séparé. Dans un module, vous pouvez contrôler quels noms d'autres modules sont visibles (via l'importation) et spécifier lesquels de vos noms sont destinés à être publics (via export et public). Les modules vous permettent de créer des définitions de niveau supérieur sans vous soucier des conflits de noms lorsque votre code est utilisé avec celui de quelqu'un d'autre. Voir la section du manuel sur les modules pour plus de détails.
Exemples
module Foo
import Base.show
export MyType, foo
struct MyType
x
end
bar(x) = 2x
foo(a::MyType) = bar(a.x) + 1
show(io::IO, a::MyType) = print(io, "MyType $(a.x)")
endexport — Keywordexportexport est utilisé dans les modules pour indiquer à Julia quels noms doivent être rendus disponibles à l'utilisateur. Par exemple : export foo rend le nom foo disponible lors de l'utilisation du module avec using. Consultez la section du manuel sur les modules pour plus de détails.
public — Keywordpublicpublic est utilisé dans les modules pour indiquer à Julia quels noms font partie de l'API publique du module. Par exemple : public foo indique que le nom foo est public, sans le rendre disponible lors de using du module. Voir la section du manuel sur les modules pour plus de détails.
Le mot-clé public a été ajouté dans Julia 1.11. Avant cela, la notion de publicité était moins explicite.
import — Keywordimportimport Foo chargera le module ou le paquet Foo. Les noms du module Foo importé peuvent être accédés avec la syntaxe par point (par exemple, Foo.foo pour accéder au nom foo). Voir la section du manuel sur les modules pour plus de détails.
using — Keywordusingusing Foo chargera le module ou le paquet Foo et rendra ses noms exportés disponibles pour une utilisation directe. Les noms peuvent également être utilisés via la syntaxe par point (par exemple Foo.foo pour accéder au nom foo), qu'ils soient exportés ou non. Voir la section du manuel sur les modules pour plus de détails.
Lorsque deux ou plusieurs paquets/modules exportent un nom et que ce nom ne fait pas référence à la même chose dans chacun des paquets, et que les paquets sont chargés via using sans une liste explicite de noms, il est alors erroné de référencer ce nom sans qualification. Il est donc recommandé que le code destiné à être compatible avec les futures versions de ses dépendances et de Julia, par exemple, le code dans les paquets publiés, liste les noms qu'il utilise de chaque paquet chargé, par exemple using Foo: Foo, f plutôt que using Foo.
as — Keywordasas est utilisé comme un mot-clé pour renommer un identifiant introduit dans le scope par import ou using, dans le but de contourner les conflits de noms ainsi que pour raccourcir les noms. (En dehors des déclarations import ou using, as n'est pas un mot-clé et peut être utilisé comme un identifiant ordinaire.)
import LinearAlgebra as LA amène la bibliothèque standard LinearAlgebra importée dans le scope sous le nom LA.
import LinearAlgebra: eigen as eig, cholesky as chol amène les méthodes eigen et cholesky de LinearAlgebra dans le scope sous les noms eig et chol respectivement.
as fonctionne avec using uniquement lorsque des identifiants individuels sont introduits dans le scope. Par exemple, using LinearAlgebra: eigen as eig ou using LinearAlgebra: eigen as eig, cholesky as chol fonctionne, mais using LinearAlgebra as LA est une syntaxe invalide, car il est insensé de renommer tous les noms exportés de LinearAlgebra en LA.
baremodule — Keywordbaremodulebaremodule déclare un module qui ne contient pas using Base ou des définitions locales de eval et include. Il importe néanmoins Core. En d'autres termes,
module Mod
...
endest équivalent à
baremodule Mod
using Base
eval(x) = Core.eval(Mod, x)
include(p) = Base.include(Mod, p)
...
endfunction — KeywordfonctionLes fonctions sont définies avec le mot-clé function :
function add(a, b)
return a + b
endOu la notation courte :
add(a, b) = a + bL'utilisation du mot-clé return est exactement la même que dans d'autres langages, mais est souvent optionnelle. Une fonction sans une instruction return explicite renverra la dernière expression dans le corps de la fonction.
macro — Keywordmacromacro définit une méthode pour insérer du code généré dans un programme. Un macro associe une séquence d'expressions d'arguments à une expression retournée, et l'expression résultante est substituée directement dans le programme au point où le macro est invoqué. Les macros sont un moyen d'exécuter du code généré sans appeler eval, puisque le code généré devient simplement une partie du programme environnant. Les arguments des macros peuvent inclure des expressions, des valeurs littérales et des symboles. Les macros peuvent être définies pour un nombre variable d'arguments (varargs), mais n'acceptent pas d'arguments de mot-clé. Chaque macro reçoit également implicitement les arguments __source__, qui contient le numéro de ligne et le nom de fichier d'où le macro est appelé, et __module__, qui est le module dans lequel le macro est développé.
Voir la section du manuel sur Metaprogramming pour plus d'informations sur la façon d'écrire un macro.
Exemples
julia> macro sayhello(name)
return :( println("Hello, ", $name, "!") )
end
@sayhello (macro with 1 method)
julia> @sayhello "Charlie"
Hello, Charlie!
julia> macro saylots(x...)
return :( println("Say: ", $(x...)) )
end
@saylots (macro with 1 method)
julia> @saylots "hey " "there " "friend"
Say: hey there friendreturn — Keywordreturnreturn x fait sortir la fonction englobante plus tôt, en renvoyant la valeur donnée x à son appelant. return tout seul sans valeur est équivalent à return nothing (voir nothing).
function compare(a, b)
a == b && return "égal à"
a < b ? "moins que" : "plus que"
endEn général, vous pouvez placer une instruction return n'importe où dans le corps d'une fonction, y compris dans des boucles ou des conditionnelles profondément imbriquées, mais faites attention avec les blocs do. Par exemple :
function test1(xs)
for x in xs
iseven(x) && return 2x
end
end
function test2(xs)
map(xs) do x
iseven(x) && return 2x
x
end
endDans le premier exemple, le retour sort de test1 dès qu'il rencontre un nombre pair, donc test1([5,6,7]) renvoie 12.
Vous pourriez vous attendre à ce que le deuxième exemple se comporte de la même manière, mais en fait le return là ne sort que de la fonction interne (à l'intérieur du bloc do) et renvoie une valeur à map. test2([5,6,7]) renvoie alors [5,12,7].
Lorsqu'il est utilisé dans une expression de niveau supérieur (c'est-à-dire en dehors de toute fonction), return fait que l'ensemble de l'expression de niveau supérieur actuelle se termine plus tôt.
do — KeyworddoCréez une fonction anonyme et passez-la comme premier argument à un appel de fonction. Par exemple :
map(1:10) do x
2x
endest équivalent à map(x->2x, 1:10).
Utilisez plusieurs arguments comme ceci :
map(1:10, 11:20) do x, y
x + y
endbegin — Keywordbeginbegin...end désigne un bloc de code.
begin
println("Hello, ")
println("World!")
endEn général, begin ne sera pas nécessaire, car des mots-clés tels que function et let commencent implicitement des blocs de code. Voir aussi ;.
begin peut également être utilisé lors de l'indexation pour représenter le premier index d'une collection ou le premier index d'une dimension d'un tableau. Par exemple, a[begin] est le premier élément d'un tableau a.
L'utilisation de begin comme index nécessite Julia 1.4 ou une version ultérieure.
Exemples
julia> A = [1 2; 3 4]
2×2 Array{Int64,2}:
1 2
3 4
julia> A[begin, :]
2-element Array{Int64,1}:
1
2end — Keywordfinfin marque la conclusion d'un bloc d'expressions, par exemple module, struct, mutable struct, begin, let, for etc.
fin peut également être utilisé lors de l'indexation pour représenter le dernier index d'une collection ou le dernier index d'une dimension d'un tableau.
Exemples
julia> A = [1 2; 3 4]
2×2 Array{Int64, 2}:
1 2
3 4
julia> A[fin, :]
2-element Array{Int64, 1}:
3
4let — KeywordletLes blocs let créent un nouveau scope strict et introduisent éventuellement de nouvelles liaisons locales.
Tout comme les autres constructions de scope, les blocs let définissent le bloc de code où les nouvelles variables locales introduites sont accessibles. De plus, la syntaxe a une signification spéciale pour les affectations séparées par des virgules et les noms de variables qui peuvent éventuellement apparaître sur la même ligne que le let :
let var1 = value1, var2, var3 = value3
code
endLes variables introduites sur cette ligne sont locales au bloc let et les affectations sont évaluées dans l'ordre, chaque côté droit étant évalué dans le scope sans tenir compte du nom à gauche. Il est donc logique d'écrire quelque chose comme let x = x, puisque les deux variables x sont distinctes avec le côté gauche masquant localement le x du scope extérieur. Cela peut même être un idiome utile car de nouvelles variables locales sont fraîchement créées chaque fois que des scopes locaux sont entrés, mais cela n'est observable que dans le cas de variables qui survivent à leur scope via des fermetures. Une variable let sans affectation, comme var2 dans l'exemple ci-dessus, déclare une nouvelle variable locale qui n'est pas encore liée à une valeur.
En revanche, les blocs begin regroupent également plusieurs expressions ensemble mais n'introduisent pas de scope ni n'ont la syntaxe d'affectation spéciale.
Exemples
Dans la fonction ci-dessous, il y a un seul x qui est mis à jour de manière itérative trois fois par le map. Les fermetures retournées font toutes référence à ce x à sa valeur finale :
julia> function test_outer_x()
x = 0
map(1:3) do _
x += 1
return ()->x
end
end
test_outer_x (generic function with 1 method)
julia> [f() for f in test_outer_x()]
3-element Vector{Int64}:
3
3
3Cependant, si nous ajoutons un bloc let qui introduit une nouvelle variable locale, nous nous retrouverons avec trois variables distinctes capturées (une à chaque itération) même si nous avons choisi d'utiliser (masquer) le même nom.
julia> function test_let_x()
x = 0
map(1:3) do _
x += 1
let x = x
return ()->x
end
end
end
test_let_x (generic function with 1 method)
julia> [f() for f in test_let_x()]
3-element Vector{Int64}:
1
2
3Toutes les constructions de scope qui introduisent de nouvelles variables locales se comportent de cette manière lorsqu'elles sont exécutées plusieurs fois ; la caractéristique distinctive de let est sa capacité à déclarer succinctement de nouveaux locals qui peuvent masquer des variables extérieures du même nom. Par exemple, utiliser directement l'argument de la fonction do capture également trois variables distinctes :
julia> function test_do_x()
map(1:3) do x
return ()->x
end
end
test_do_x (generic function with 1 method)
julia> [f() for f in test_do_x()]
3-element Vector{Int64}:
1
2
3if — Keywordif/elseif/elseif/elseif/else effectue une évaluation conditionnelle, ce qui permet à des portions de code d'être évaluées ou non en fonction de la valeur d'une expression booléenne. Voici l'anatomie de la syntaxe conditionnelle if/elseif/else :
if x < y
println("x est inférieur à y")
elseif x > y
println("x est supérieur à y")
else
println("x est égal à y")
endSi l'expression conditionnelle x < y est vraie, alors le bloc correspondant est évalué ; sinon, l'expression conditionnelle x > y est évaluée, et si elle est vraie, le bloc correspondant est évalué ; si aucune des deux expressions n'est vraie, le bloc else est évalué. Les blocs elseif et else sont optionnels, et autant de blocs elseif que désiré peuvent être utilisés.
Contrairement à certains autres langages, les conditions doivent être de type Bool. Il ne suffit pas que les conditions soient convertibles en Bool.
julia> if 1 end
ERROR: TypeError: non-boolean (Int64) used in boolean contextfor — Keywordpourpour les boucles évaluent à plusieurs reprises un bloc d'instructions tout en itérant sur une séquence de valeurs.
La variable d'itération est toujours une nouvelle variable, même si une variable du même nom existe dans la portée englobante. Utilisez outer pour réutiliser une variable locale existante pour l'itération.
Exemples
julia> pour i dans [1, 4, 0]
println(i)
fin
1
4
0while — KeywordwhileLes boucles while évaluent de manière répétée une expression conditionnelle et continuent d'évaluer le corps de la boucle while tant que l'expression reste vraie. Si l'expression conditionnelle est fausse lorsque la boucle while est atteinte pour la première fois, le corps n'est jamais évalué.
Exemples
julia> i = 1
1
julia> while i < 5
println(i)
global i += 1
end
1
2
3
4break — KeywordbreakSortir immédiatement d'une boucle.
Exemples
julia> i = 0
0
julia> while true
global i += 1
i > 5 && break
println(i)
end
1
2
3
4
5continue — KeywordcontinueSauter le reste de l'itération actuelle de la boucle.
Exemples
julia> for i = 1:6
iseven(i) && continue
println(i)
end
1
3
5try — Keywordtry/catchUne instruction try/catch permet d'intercepter les erreurs (exceptions) lancées par throw afin que l'exécution du programme puisse se poursuivre. Par exemple, le code suivant tente d'écrire un fichier, mais avertit l'utilisateur et continue au lieu de terminer l'exécution si le fichier ne peut pas être écrit :
try
open("/danger", "w") do f
println(f, "Hello")
end
catch
@warn "Could not write file."
endou, lorsque le fichier ne peut pas être lu dans une variable :
lines = try
open("/danger", "r") do f
readlines(f)
end
catch
@warn "File not found."
endLa syntaxe catch e (où e est n'importe quelle variable) assigne l'objet d'exception lancé à la variable donnée dans le bloc catch.
La puissance de la construction try/catch réside dans la capacité de défaire immédiatement un calcul profondément imbriqué à un niveau beaucoup plus élevé dans la pile des fonctions appelantes.
finally — KeywordfinalementExécutez du code lorsqu'un bloc de code donné se termine, peu importe comment il se termine. Par exemple, voici comment nous pouvons garantir qu'un fichier ouvert est fermé :
f = open("file")
try
operate_on_file(f)
finally
close(f)
endLorsque le contrôle quitte le bloc try (par exemple, en raison d'un return, ou simplement en se terminant normalement), close(f) sera exécuté. Si le bloc try se termine en raison d'une exception, l'exception continuera à se propager. Un bloc catch peut également être combiné avec try et finally. Dans ce cas, le bloc finally s'exécutera après que catch ait géré l'erreur.
quote — Keywordquotequote crée plusieurs objets d'expression dans un bloc sans utiliser le constructeur explicite Expr. Par exemple :
ex = quote
x = 1
y = 2
x + y
endContrairement aux autres moyens de citation, :( ... ), cette forme introduit des éléments QuoteNode dans l'arbre d'expression, qui doivent être pris en compte lors de la manipulation directe de l'arbre. Pour d'autres usages, :( ... ) et les blocs quote .. end sont traités de manière identique.
local — Keywordlocallocal introduit une nouvelle variable locale. Voir la section du manuel sur la portée des variables pour plus d'informations.
Exemples
julia> function foo(n)
x = 0
for i = 1:n
local x # introduire un x local à la boucle
x = i
end
x
end
foo (generic function with 1 method)
julia> foo(10)
0global — Keywordglobalglobal x fait en sorte que x dans la portée actuelle et ses portées intérieures se réfère à la variable globale de ce nom. Voir la section du manuel sur la portée des variables pour plus d'informations.
Exemples
julia> z = 3
3
julia> function foo()
global z = 6 # utilise la variable z définie en dehors de foo
end
foo (generic function with 1 method)
julia> foo()
6
julia> z
6outer — Keywordpour outerRéutilisez une variable locale existante pour l'itération dans une boucle for.
Voir la section du manuel sur la portée des variables pour plus d'informations.
Voir aussi for.
Exemples
julia> function f()
i = 0
for i = 1:3
# vide
end
return i
end;
julia> f()
0julia> function f()
i = 0
for outer i = 1:3
# vide
end
return i
end;
julia> f()
3julia> i = 0 # variable globale
for outer i = 1:3
end
ERREUR: syntaxe : aucune déclaration de variable locale externe n'existe pour "for outer"
[...]const — Keywordconstconst est utilisé pour déclarer des variables globales dont les valeurs ne changeront pas. Dans presque tout le code (et en particulier dans le code sensible à la performance), les variables globales doivent être déclarées constantes de cette manière.
const x = 5Plusieurs variables peuvent être déclarées dans un seul const :
const y, z = 7, 11Notez que const ne s'applique qu'à une seule opération = ; par conséquent, const x = y = 1 déclare x comme constant mais pas y. En revanche, const x = const y = 1 déclare à la fois x et y constants.
Notez que la "constance" ne s'étend pas aux conteneurs mutables ; seule l'association entre une variable et sa valeur est constante. Si x est un tableau ou un dictionnaire (par exemple), vous pouvez toujours modifier, ajouter ou supprimer des éléments.
Dans certains cas, changer la valeur d'une variable const donne un avertissement au lieu d'une erreur. Cependant, cela peut produire un comportement imprévisible ou corrompre l'état de votre programme, et donc cela doit être évité. Cette fonctionnalité est destinée uniquement à la commodité lors de l'utilisation interactive.
struct — KeywordstructLe type le plus couramment utilisé en Julia est un struct, spécifié par un nom et un ensemble de champs.
struct Point
x
y
endLes champs peuvent avoir des restrictions de type, qui peuvent être paramétrées :
struct Point{X}
x::X
y::Float64
endUn struct peut également déclarer un super type abstrait via la syntaxe <: :
struct Point <: AbstractPoint
x
y
endLes structs sont immuables par défaut ; une instance de l'un de ces types ne peut pas être modifiée après sa construction. Utilisez mutable struct à la place pour déclarer un type dont les instances peuvent être modifiées.
Voir la section du manuel sur Composite Types pour plus de détails, comme la façon de définir des constructeurs.
mutable struct — Keywordmutable structmutable struct est similaire à struct, mais permet en plus de modifier les champs du type après sa construction.
Les champs individuels d'un mutable struct peuvent être marqués comme const pour les rendre immuables :
mutable struct Baz
a::Int
const b::Float64
endLe mot-clé const pour les champs des mutable structs nécessite au moins Julia 1.8.
Consultez la section du manuel sur Composite Types pour plus d'informations.
Base.@kwdef — Macro@kwdef typedefCeci est une macro d'aide qui définit automatiquement un constructeur basé sur des mots-clés pour le type déclaré dans l'expression typedef, qui doit être une expression struct ou mutable struct. L'argument par défaut est fourni en déclarant des champs sous la forme field::T = default ou field = default. Si aucun défaut n'est fourni, alors l'argument de mot-clé devient un argument de mot-clé requis dans le constructeur de type résultant.
Des constructeurs internes peuvent toujours être définis, mais au moins un doit accepter des arguments sous la même forme que le constructeur interne par défaut (c'est-à-dire un argument positionnel par champ) afin de fonctionner correctement avec le constructeur externe basé sur des mots-clés.
Base.@kwdef pour les structs paramétriques, et les structs avec des supertypes nécessite au moins Julia 1.1.
Cette macro est exportée depuis Julia 1.9.
Exemples
julia> @kwdef struct Foo
a::Int = 1 # défaut spécifié
b::String # mot-clé requis
end
Foo
julia> Foo(b="hi")
Foo(1, "hi")
julia> Foo()
ERROR: UndefKeywordError: argument de mot-clé `b` non assigné
Stacktrace:
[...]abstract type — Keywordtype abstraittype abstrait déclare un type qui ne peut pas être instancié et sert uniquement de nœud dans le graphe des types, décrivant ainsi des ensembles de types concrets liés : ces types concrets qui en sont les descendants. Les types abstraits forment la hiérarchie conceptuelle qui rend le système de types de Julia plus qu'une simple collection d'implémentations d'objets. Par exemple :
type abstrait Nombre fin
type abstrait Réel <: Nombre finNombre n'a pas de supertype, tandis que Réel est un sous-type abstrait de Nombre.
primitive type — Keywordtype primitiftype primitif déclare un type concret dont les données consistent uniquement en une série de bits. Des exemples classiques de types primitifs sont les entiers et les valeurs à virgule flottante. Voici quelques déclarations de types primitifs intégrés en exemple :
type primitif Char 32 fin
type primitif Bool <: Integer 8 finLe nombre après le nom indique combien de bits de stockage le type nécessite. Actuellement, seules les tailles qui sont des multiples de 8 bits sont prises en charge. La déclaration Bool montre comment un type primitif peut être déclaré en option comme un sous-type d'un supertype.
where — KeywordoùLe mot-clé où crée un type UnionAll, qui peut être considéré comme une union itérée d'autres types, sur toutes les valeurs d'une certaine variable. Par exemple, Vector{T} où T<:Real inclut tous les Vectors où le type d'élément est une sorte de nombre Real.
La liaison de variable par défaut est Any si elle est omise :
Vector{T} où T # abréviation pour `où T<:Any`Les variables peuvent également avoir des bornes inférieures :
Vector{T} où T>:Int
Vector{T} où Int<:T<:RealIl existe également une syntaxe concise pour les expressions où imbriquées. Par exemple, ceci :
Pair{T, S} où S<:Array{T} où T<:Numberpeut être abrégé en :
Pair{T, S} où {T<:Number, S<:Array{T}}Cette forme se trouve souvent dans les signatures de méthode.
Notez que dans cette forme, les variables sont listées dans l'ordre extérieur d'abord. Cela correspond à l'ordre dans lequel les variables sont substituées lorsque un type est "appliqué" à des valeurs de paramètres en utilisant la syntaxe T{p1, p2, ...}.
... — KeywordL'opérateur "splat", `...`, représente une séquence d'arguments. `...` peut être utilisé dans les définitions de fonction, pour indiquer que la fonction accepte un nombre arbitraire d'arguments. `...` peut également être utilisé pour appliquer une fonction à une séquence d'arguments.
# Exemples
jldoctest julia> add(xs...) = reduce(+, xs) add (generic function with 1 method)
julia> add(1, 2, 3, 4, 5) 15
julia> add([1, 2, 3]...) 6
julia> add(7, 1:100..., 1000:1100...) 111107
; — Keyword;; a un rôle similaire en Julia comme dans de nombreux langages de type C, et est utilisé pour délimiter la fin de l'instruction précédente.
; n'est pas nécessaire à la fin d'une ligne, mais peut être utilisé pour séparer des instructions sur une seule ligne ou pour joindre des instructions en une seule expression.
Ajouter ; à la fin d'une ligne dans le REPL supprimera l'impression du résultat de cette expression.
Dans les déclarations de fonction, et optionnellement dans les appels, ; sépare les arguments réguliers des mots-clés.
Dans les littéraux de tableau, les arguments séparés par des points-virgules ont leur contenu concaténé ensemble. Un séparateur composé d'un seul ; concatène verticalement (c'est-à-dire le long de la première dimension), ;; concatène horizontalement (deuxième dimension), ;;; concatène le long de la troisième dimension, etc. Un tel séparateur peut également être utilisé en dernière position dans les crochets pour ajouter des dimensions supplémentaires de longueur 1.
Un ; en première position à l'intérieur de parenthèses peut être utilisé pour construire un tuple nommé. La même syntaxe (; ...) sur le côté gauche d'une affectation permet de déstructurer des propriétés.
Dans le REPL standard, taper ; sur une ligne vide passera en mode shell.
Exemples
julia> function foo()
x = "Hello, "; x *= "World!"
return x
end
foo (generic function with 1 method)
julia> bar() = (x = "Hello, Mars!"; return x)
bar (generic function with 1 method)
julia> foo();
julia> bar()
"Hello, Mars!"
julia> function plot(x, y; style="solid", width=1, color="black")
###
end
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> [1; 3;; 2; 4;;; 10*A]
2×2×2 Array{Int64, 3}:
[:, :, 1] =
1 2
3 4
[:, :, 2] =
10 20
30 40
julia> [2; 3;;;]
2×1×1 Array{Int64, 3}:
[:, :, 1] =
2
3
julia> nt = (; x=1) # sans le ; ou une virgule finale, cela assignerait à x
(x = 1,)
julia> key = :a; c = 3;
julia> nt2 = (; key => 1, b=2, c, nt.x)
(a = 1, b = 2, c = 3, x = 1)
julia> (; b, x) = nt2; # définir les variables b et x en utilisant la déstructuration de propriété
julia> b, x
(2, 1)
julia> ; # en tapant ;, l'invite change (sur place) en : shell>
shell> echo hello
hello= — Keyword== est l'opérateur d'assignation.
- Pour la variable
aet l'expressionb,a = bfait queafait référence à la valeur deb. - Pour les fonctions
f(x),f(x) = xdéfinit une nouvelle constante de fonctionf, ou ajoute une nouvelle méthode àfsifest déjà défini ; cette utilisation est équivalente àfunction f(x); x; end. a[i] = vappellesetindex!(a,v,i).a.b = cappellesetproperty!(a,:b,c).- À l'intérieur d'un appel de fonction,
f(a=b)passebcomme la valeur de l'argument cléa. - À l'intérieur de parenthèses avec des virgules,
(a=1,)construit unNamedTuple.
Exemples
L'assignation de a à b ne crée pas une copie de b ; utilisez plutôt copy ou deepcopy.
julia> b = [1]; a = b; b[1] = 2; a
1-element Array{Int64, 1}:
2
julia> b = [1]; a = copy(b); b[1] = 2; a
1-element Array{Int64, 1}:
1
Les collections passées aux fonctions ne sont également pas copiées. Les fonctions peuvent modifier (muter) le contenu des objets auxquels leurs arguments font référence. (Les noms des fonctions qui font cela sont conventionnellement suffixés par '!'.)
julia> function f!(x); x[:] .+= 1; end
f! (generic function with 1 method)
julia> a = [1]; f!(a); a
1-element Array{Int64, 1}:
2
L'assignation peut fonctionner sur plusieurs variables en parallèle, prenant des valeurs d'un itérable :
julia> a, b = 4, 5
(4, 5)
julia> a, b = 1:3
1:3
julia> a, b
(1, 2)
L'assignation peut fonctionner sur plusieurs variables en série, et renverra la valeur de l'expression la plus à droite :
julia> a = [1]; b = [2]; c = [3]; a = b = c
1-element Array{Int64, 1}:
3
julia> b[1] = 2; a, b, c
([2], [2], [2])
L'assignation à des indices hors limites ne fait pas croître une collection. Si la collection est un Vector, elle peut plutôt être agrandie avec push! ou append!.
julia> a = [1, 1]; a[3] = 2
ERROR: BoundsError: attempt to access 2-element Array{Int64, 1} at index [3]
[...]
julia> push!(a, 2, 3)
4-element Array{Int64, 1}:
1
1
2
3
L'assignation de [] n'élimine pas les éléments d'une collection ; utilisez plutôt filter!.
julia> a = collect(1:3); a[a .<= 1] = []
ERROR: DimensionMismatch: tried to assign 0 elements to 1 destinations
[...]
julia> filter!(x -> x > 1, a) # in-place & thus more efficient than a = a[a .> 1]
2-element Array{Int64, 1}:
2
3
?: — Keyworda ? b : cForme courte pour les conditionnels ; se lit "si a, évaluer b sinon évaluer c". Également connu sous le nom de opérateur ternaire.
Cette syntaxe est équivalente à if a; b else c end, mais est souvent utilisée pour mettre en avant la valeur b-ou-c qui est utilisée comme partie d'une expression plus grande, plutôt que les effets secondaires que l'évaluation de b ou c peut avoir.
Voir la section du manuel sur flux de contrôle pour plus de détails.
Exemples
julia> x = 1; y = 2;
julia> x > y ? println("x est plus grand") : println("x n'est pas plus grand")
x n'est pas plus grand
julia> x > y ? "x est plus grand" : x == y ? "x et y sont égaux" : "y est plus grand"
"y est plus grand"Standard Modules
Main — ModulePrincipalPrincipal est le module de niveau supérieur, et Julia commence avec Principal défini comme le module courant. Les variables définies à l'invite vont dans Principal, et varinfo liste les variables dans Principal.
julia> @__MODULE__
PrincipalCore — ModuleNoyauNoyau est le module qui contient tous les identifiants considérés comme "intégrés" au langage, c'est-à-dire faisant partie du langage de base et non des bibliothèques. Chaque module spécifie implicitement using Noyau, car vous ne pouvez rien faire sans ces définitions.
Base — ModuleBaseLa bibliothèque de base de Julia. Base est un module qui contient des fonctionnalités de base (le contenu de base/). Tous les modules contiennent implicitement using Base, car cela est nécessaire dans la grande majorité des cas.
Base Submodules
Base.Broadcast — ModuleBase.BroadcastModule contenant l'implémentation de la diffusion.
Base.Docs — ModuleDocsLe module Docs fournit la macro @doc qui peut être utilisée pour définir et récupérer des métadonnées de documentation pour les objets Julia.
Veuillez consulter la section du manuel sur documentation pour plus d'informations.
Base.Iterators — ModuleMéthodes pour travailler avec les Itérateurs.
Base.Libc — ModuleInterface à libc, la bibliothèque standard C.
Base.Meta — ModuleFonctions de commodité pour la métaprogrammation.
Base.StackTraces — ModuleOutils pour collecter et manipuler les traces de pile. Principalement utilisés pour construire des erreurs.
Base.Sys — ModuleFournir des méthodes pour récupérer des informations sur le matériel et le système d'exploitation.
Base.Threads — ModuleSupport de multithreading.
Base.GC — ModuleBase.GCModule avec des utilitaires de collecte des déchets.
All Objects
Core.:=== — Function===(x,y) -> Bool
≡(x,y) -> BoolDéterminez si x et y sont identiques, dans le sens où aucun programme ne pourrait les distinguer. D'abord, les types de x et y sont comparés. Si ceux-ci sont identiques, les objets mutables sont comparés par adresse en mémoire et les objets immuables (comme les nombres) sont comparés par contenu au niveau des bits. Cette fonction est parfois appelée "égal". Elle retourne toujours une valeur Bool.
Exemples
julia> a = [1, 2]; b = [1, 2];
julia> a == b
true
julia> a === b
false
julia> a === a
trueCore.isa — Functionisa(x, type) -> BoolDétermine si x est du type donné type. Peut également être utilisé comme un opérateur infixe, par exemple x isa type.
Exemples
julia> isa(1, Int)
true
julia> isa(1, Matrix)
false
julia> isa(1, Char)
false
julia> isa(1, Number)
true
julia> 1 isa Number
trueBase.isequal — Functionisequal(x, y) -> BoolSemblable à ==, sauf pour le traitement des nombres à virgule flottante et des valeurs manquantes. isequal considère toutes les valeurs NaN à virgule flottante comme égales entre elles, considère -0.0 comme inégal à 0.0, et missing comme égal à missing. Renvoie toujours une valeur de type Bool.
isequal est une relation d'équivalence - elle est réflexive (=== implique isequal), symétrique (isequal(a, b) implique isequal(b, a)) et transitive (isequal(a, b) et isequal(b, c) implique isequal(a, c)).
Implémentation
L'implémentation par défaut de isequal appelle ==, donc un type qui n'implique pas de valeurs à virgule flottante n'a généralement besoin de définir que ==.
isequal est la fonction de comparaison utilisée par les tables de hachage (Dict). isequal(x,y) doit impliquer que hash(x) == hash(y).
Cela signifie généralement que les types pour lesquels une méthode personnalisée == ou isequal existe doivent implémenter une méthode hash correspondante (et vice versa). Les collections implémentent généralement isequal en appelant isequal de manière récursive sur tous les contenus.
De plus, isequal est lié à isless, et ils travaillent ensemble pour définir un ordre total fixe, où exactement l'un de isequal(x, y), isless(x, y), ou isless(y, x) doit être true (et les deux autres false).
Les types scalaires n'ont généralement pas besoin d'implémenter isequal séparément de ==, à moins qu'ils ne représentent des nombres à virgule flottante susceptibles d'une implémentation plus efficace que celle fournie comme solution générique (basée sur isnan, signbit, et ==).
Exemples
julia> isequal([1., NaN], [1., NaN])
true
julia> [1., NaN] == [1., NaN]
false
julia> 0.0 == -0.0
true
julia> isequal(0.0, -0.0)
false
julia> missing == missing
missing
julia> isequal(missing, missing)
trueisequal(x)Créez une fonction qui compare son argument à x en utilisant isequal, c'est-à-dire une fonction équivalente à y -> isequal(y, x).
La fonction retournée est de type Base.Fix2{typeof(isequal)}, qui peut être utilisée pour implémenter des méthodes spécialisées.
Base.isless — Functionisless(x, y)Testez si x est inférieur à y, selon un ordre total fixe (défini avec isequal). isless n'est pas défini pour les paires (x, y) de tous types. Cependant, s'il est défini, il est censé satisfaire les conditions suivantes :
- Si
isless(x, y)est défini, alorsisless(y, x)etisequal(x, y)le sont aussi, et exactement l'un de ces trois renvoietrue. - La relation définie par
islessest transitive, c'est-à-dire queisless(x, y) && isless(y, z)impliqueisless(x, z).
Les valeurs qui sont normalement non ordonnées, comme NaN, sont ordonnées après les valeurs régulières. Les valeurs missing sont ordonnées en dernier.
C'est la comparaison par défaut utilisée par sort!.
Implémentation
Les types non numériques avec un ordre total devraient implémenter cette fonction. Les types numériques n'ont besoin de l'implémenter que s'ils ont des valeurs spéciales telles que NaN. Les types avec un ordre partiel devraient implémenter <. Consultez la documentation sur Ordres Alternatifs pour savoir comment définir des méthodes d'ordre alternatives qui peuvent être utilisées dans le tri et les fonctions connexes.
Exemples
julia> isless(1, 3)
true
julia> isless("Red", "Blue")
falseBase.isunordered — Functionisunordered(x)Retourne true si x est une valeur qui n'est pas ordonnable selon <, comme NaN ou missing.
Les valeurs qui évaluent à true avec ce prédicat peuvent être ordonnables par rapport à d'autres ordres tels que isless.
Cette fonction nécessite Julia 1.7 ou une version ultérieure.
Base.ifelse — Functionifelse(condition::Bool, x, y)Retourne x si condition est true, sinon retourne y. Cela diffère de ? ou if en ce sens que c'est une fonction ordinaire, donc tous les arguments sont évalués en premier. Dans certains cas, utiliser ifelse au lieu d'une instruction if peut éliminer la branche dans le code généré et fournir de meilleures performances dans des boucles serrées.
Exemples
julia> ifelse(1 > 2, 1, 2)
2Core.typeassert — Functiontypeassert(x, type)Lève une TypeError à moins que x isa type. La syntaxe x::type appelle cette fonction.
Exemples
julia> typeassert(2.5, Int)
ERROR: TypeError: in typeassert, expected Int64, got a value of type Float64
Stacktrace:
[...]Core.typeof — Functiontypeof(x)Obtenez le type concret de x.
Voir aussi eltype.
Exemples
julia> a = 1//2;
julia> typeof(a)
Rational{Int64}
julia> M = [1 2; 3.5 4];
julia> typeof(M)
Matrix{Float64} (alias pour Array{Float64, 2})Core.tuple — Functiontuple(xs...)Construit un tuple des objets donnés.
Voir aussi Tuple, ntuple, NamedTuple.
Exemples
julia> tuple(1, 'b', pi)
(1, 'b', π)
julia> ans === (1, 'b', π)
true
julia> Tuple(Real[1, 2, pi]) # prend une collection
(1, 2, π)Base.ntuple — Functionntuple(f, n::Integer)Crée un tuple de longueur n, en calculant chaque élément comme f(i), où i est l'index de l'élément.
Exemples
julia> ntuple(i -> 2*i, 4)
(2, 4, 6, 8)ntuple(f, ::Val{N})Crée un tuple de longueur N, en calculant chaque élément comme f(i), où i est l'index de l'élément. En prenant un argument Val(N), il est possible que cette version de ntuple génère un code plus efficace que la version prenant la longueur comme un entier. Mais ntuple(f, N) est préférable à ntuple(f, Val(N)) dans les cas où N ne peut pas être déterminé à la compilation.
Exemples
julia> ntuple(i -> 2*i, Val(4))
(2, 4, 6, 8)Base.objectid — Functionobjectid(x) -> UIntObtenez une valeur de hachage pour x basée sur l'identité de l'objet.
Si x === y alors objectid(x) == objectid(y), et généralement lorsque x !== y, objectid(x) != objectid(y).
Base.hash — Functionhash(x[, h::UInt]) -> UIntCalculez un code de hachage entier tel que isequal(x,y) implique hash(x)==hash(y). L'argument optionnel h est un autre code de hachage à mélanger avec le résultat.
Les nouveaux types doivent implémenter la forme à 2 arguments, généralement en appelant de manière récursive la méthode hash à 2 arguments afin de mélanger les hachages des contenus entre eux (et avec h). En général, tout type qui implémente hash doit également implémenter son propre == (d'où isequal) pour garantir la propriété mentionnée ci-dessus.
La valeur de hachage peut changer lorsqu'un nouveau processus Julia est démarré.
julia> a = hash(10)
0x95ea2955abd45275
julia> hash(10, a) # n'utilisez que la sortie d'une autre fonction de hachage comme deuxième argument
0xd42bad54a8575b16Base.finalizer — Functionfinalizer(f, x)Enregistre une fonction f(x) à appeler lorsqu'il n'y a plus de références accessibles par le programme à x, et retourne x. Le type de x doit être un mutable struct, sinon la fonction lèvera une exception.
f ne doit pas provoquer de changement de tâche, ce qui exclut la plupart des opérations d'E/S telles que println. Utiliser la macro @async (pour différer le changement de contexte à l'extérieur du finaliseur) ou ccall pour invoquer directement des fonctions d'E/S en C peut être utile à des fins de débogage.
Notez qu'il n'y a pas d'âge de monde garanti pour l'exécution de f. Il peut être appelé dans l'âge de monde dans lequel le finaliseur a été enregistré ou dans un âge de monde ultérieur.
Exemples
finalizer(my_mutable_struct) do x
@async println("Finalizing $x.")
end
finalizer(my_mutable_struct) do x
ccall(:jl_safe_printf, Cvoid, (Cstring, Cstring), "Finalizing %s.", repr(x))
endUn finaliseur peut être enregistré lors de la construction de l'objet. Dans l'exemple suivant, notez que nous comptons implicitement sur le finaliseur retournant le mutable struct nouvellement créé x.
mutable struct MyMutableStruct
bar
function MyMutableStruct(bar)
x = new(bar)
f(t) = @async println("Finalizing $t.")
finalizer(f, x)
end
endBase.finalize — Functionfinalize(x)Exécute immédiatement les finaliseurs enregistrés pour l'objet x.
Base.copy — Functioncopy(x)Crée une copie superficielle de x : la structure externe est copiée, mais pas toutes les valeurs internes. Par exemple, copier un tableau produit un nouveau tableau avec des éléments identiques à ceux de l'original.
Base.deepcopy — Functiondeepcopy(x)Crée une copie profonde de x : tout est copié récursivement, ce qui donne un objet entièrement indépendant. Par exemple, la copie profonde d'un tableau crée des copies profondes de tous les objets qu'il contient et produit un nouveau tableau avec la structure de relation cohérente (par exemple, si les deux premiers éléments sont le même objet dans le tableau original, les deux premiers éléments du nouveau tableau seront également le même objet deepcopyé). Appeler deepcopy sur un objet devrait généralement avoir le même effet que de le sérialiser puis de le désérialiser.
Bien qu'il ne soit normalement pas nécessaire, les types définis par l'utilisateur peuvent remplacer le comportement par défaut de deepcopy en définissant une version spécialisée de la fonction deepcopy_internal(x::T, dict::IdDict) (qui ne devrait pas être utilisée autrement), où T est le type à spécialiser, et dict garde une trace des objets copiés jusqu'à présent dans la récursion. Dans la définition, deepcopy_internal doit être utilisé à la place de deepcopy, et la variable dict doit être mise à jour comme il se doit avant de retourner.
Base.getproperty — Functiongetproperty(value, name::Symbol)
getproperty(value, name::Symbol, order::Symbol)La syntaxe a.b appelle getproperty(a, :b). La syntaxe @atomic order a.b appelle getproperty(a, :b, :order) et la syntaxe @atomic a.b appelle getproperty(a, :b, :sequentially_consistent).
Exemples
julia> struct MyType{T <: Number}
x::T
end
julia> function Base.getproperty(obj::MyType, sym::Symbol)
if sym === :special
return obj.x + 1
else # fallback to getfield
return getfield(obj, sym)
end
end
julia> obj = MyType(1);
julia> obj.special
2
julia> obj.x
1On ne devrait surcharger getproperty que lorsque c'est nécessaire, car cela peut être déroutant si le comportement de la syntaxe obj.f est inhabituel. Notez également que l'utilisation de méthodes est souvent préférable. Voir aussi cette documentation de guide de style pour plus d'informations : Préférer les méthodes exportées à l'accès direct aux champs.
Voir aussi getfield, propertynames et setproperty!.
Base.setproperty! — Functionsetproperty!(value, name::Symbol, x)
setproperty!(value, name::Symbol, x, order::Symbol)La syntaxe a.b = c appelle setproperty!(a, :b, c). La syntaxe @atomic order a.b = c appelle setproperty!(a, :b, c, :order) et la syntaxe @atomic a.b = c appelle setproperty!(a, :b, c, :sequentially_consistent).
setproperty! sur les modules nécessite au moins Julia 1.8.
Voir aussi setfield!, propertynames et getproperty.
Base.replaceproperty! — Functionreplaceproperty!(x, f::Symbol, expected, desired, success_order::Symbol=:not_atomic, fail_order::Symbol=success_order)Effectuez une opération de comparaison et d'échange sur x.f de expected à desired, par égal. La syntaxe @atomicreplace x.f expected => desired peut être utilisée à la place de la forme d'appel de fonction.
Voir aussi replacefield! setproperty!, setpropertyonce!.
Base.swapproperty! — Functionswapproperty!(x, f::Symbol, v, order::Symbol=:not_atomic)La syntaxe @atomic a.b, _ = c, a.b renvoie (c, swapproperty!(a, :b, c, :sequentially_consistent)), où il doit y avoir une expression getproperty commune aux deux côtés.
Voir aussi swapfield! et setproperty!.
Base.modifyproperty! — Functionmodifyproperty!(x, f::Symbol, op, v, order::Symbol=:not_atomic)La syntaxe @atomic op(x.f, v) (et son équivalent @atomic x.f op v) renvoie modifyproperty!(x, :f, op, v, :sequentially_consistent), où le premier argument doit être une expression getproperty et est modifié de manière atomique.
L'invocation de op(getproperty(x, f), v) doit renvoyer une valeur qui peut être stockée dans le champ f de l'objet x par défaut. En particulier, contrairement au comportement par défaut de setproperty!, la fonction convert n'est pas appelée automatiquement.
Voir aussi modifyfield! et setproperty!.
Base.setpropertyonce! — Functionsetpropertyonce!(x, f::Symbol, value, success_order::Symbol=:not_atomic, fail_order::Symbol=success_order)Effectuez une opération de comparaison et d'échange sur x.f pour le définir sur value s'il n'était pas précédemment défini. La syntaxe @atomiconce x.f = value peut être utilisée à la place de la forme d'appel de fonction.
Voir aussi setfieldonce!, setproperty!, replaceproperty!.
Cette fonction nécessite Julia 1.11 ou une version ultérieure.
Base.propertynames — Functionpropertynames(x, private=false)Obtenez un tuple ou un vecteur des propriétés (x.property) d'un objet x. Cela correspond généralement à fieldnames(typeof(x)), mais les types qui redéfinissent getproperty devraient généralement redéfinir propertynames également pour obtenir les propriétés d'une instance du type.
propertynames(x) peut ne retourner que les noms de propriétés "publiques" qui font partie de l'interface documentée de x. Si vous souhaitez qu'il retourne également les noms de propriétés "privées" destinées à un usage interne, passez true comme deuxième argument optionnel. La complétion par tabulation dans le REPL sur x. n'affiche que les propriétés private=false.
Voir aussi : hasproperty, hasfield.
Base.hasproperty — Functionhasproperty(x, s::Symbol)Renvoie un booléen indiquant si l'objet x a s comme l'une de ses propres propriétés.
Cette fonction nécessite au moins Julia 1.2.
Voir aussi : propertynames, hasfield.
Core.getfield — Functiongetfield(value, name::Symbol, [order::Symbol])
getfield(value, i::Int, [order::Symbol])Extraire un champ d'une valeur composite value par nom ou position. En option, un ordre peut être défini pour l'opération. Si le champ a été déclaré @atomic, il est fortement recommandé que la spécification soit compatible avec les stockages à cet emplacement. Sinon, s'il n'est pas déclaré comme @atomic, ce paramètre doit être :not_atomic s'il est spécifié. Voir aussi getproperty et fieldnames.
Exemples
julia> a = 1//2
1//2
julia> getfield(a, :num)
1
julia> a.num
1
julia> getfield(a, 1)
1Core.setfield! — Functionsetfield!(value, name::Symbol, x, [order::Symbol])
setfield!(value, i::Int, x, [order::Symbol])Assignez x à un champ nommé dans value de type composite. Le value doit être mutable et x doit être un sous-type de fieldtype(typeof(value), name). De plus, un ordre peut être spécifié pour cette opération. Si le champ a été déclaré @atomic, cette spécification est obligatoire. Sinon, s'il n'est pas déclaré comme @atomic, il doit être :not_atomic s'il est spécifié. Voir aussi setproperty!.
Exemples
julia> mutable struct MyMutableStruct
field::Int
end
julia> a = MyMutableStruct(1);
julia> setfield!(a, :field, 2);
julia> getfield(a, :field)
2
julia> a = 1//2
1//2
julia> setfield!(a, :num, 3);
ERROR: setfield!: immutable struct of type Rational cannot be changedCore.modifyfield! — Functionmodifyfield!(value, name::Symbol, op, x, [order::Symbol]) -> Pair
modifyfield!(value, i::Int, op, x, [order::Symbol]) -> PairEffectuer atomiquement les opérations pour obtenir et définir un champ après avoir appliqué la fonction op.
y = getfield(value, name)
z = op(y, x)
setfield!(value, name, z)
return y => zSi pris en charge par le matériel (par exemple, incrément atomique), cela peut être optimisé vers l'instruction matérielle appropriée, sinon cela utilisera une boucle.
Cette fonction nécessite Julia 1.7 ou une version ultérieure.
Core.replacefield! — Functionreplacefield!(value, name::Symbol, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)
replacefield!(value, i::Int, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)Effectuer atomiquement les opérations pour obtenir et conditionnellement définir un champ à une valeur donnée.
y = getfield(value, name, fail_order)
ok = y === expected
if ok
setfield!(value, name, desired, success_order)
end
return (; old = y, success = ok)Si pris en charge par le matériel, cela peut être optimisé pour l'instruction matérielle appropriée, sinon cela utilisera une boucle.
Cette fonction nécessite Julia 1.7 ou une version ultérieure.
Core.swapfield! — Functionswapfield!(value, name::Symbol, x, [order::Symbol])
swapfield!(value, i::Int, x, [order::Symbol])Effectuer atomiquement les opérations pour obtenir et définir simultanément un champ :
y = getfield(value, name)
setfield!(value, name, x)
return yCette fonction nécessite Julia 1.7 ou une version ultérieure.
Core.setfieldonce! — Functionsetfieldonce!(value, name::Union{Int,Symbol}, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> success::BoolEffectuer atomiquement les opérations pour définir un champ à une valeur donnée, uniquement s'il n'a pas été précédemment défini.
ok = !isdefined(value, name, fail_order)
if ok
setfield!(value, name, desired, success_order)
end
return okCette fonction nécessite Julia 1.11 ou une version ultérieure.
Core.isdefined — Functionisdefined(m::Module, s::Symbol, [order::Symbol])
isdefined(object, s::Symbol, [order::Symbol])
isdefined(object, index::Int, [order::Symbol])Teste si une variable globale ou un champ d'objet est défini. Les arguments peuvent être un module et un symbole ou un objet composite et un nom de champ (sous forme de symbole) ou un index. En option, un ordre peut être défini pour l'opération. Si le champ a été déclaré @atomic, il est fortement recommandé que la spécification soit compatible avec les stockages à cet emplacement. Sinon, s'il n'est pas déclaré comme @atomic, ce paramètre doit être :not_atomic s'il est spécifié.
Pour tester si un élément de tableau est défini, utilisez isassigned à la place.
Voir aussi @isdefined.
Exemples
julia> isdefined(Base, :sum)
true
julia> isdefined(Base, :NonExistentMethod)
false
julia> a = 1//2;
julia> isdefined(a, 2)
true
julia> isdefined(a, 3)
false
julia> isdefined(a, :num)
true
julia> isdefined(a, :numerator)
falseBase.@isdefined — Macro@isdefined s -> BoolTeste si la variable s est définie dans le scope actuel.
Voir aussi isdefined pour les propriétés de champ et isassigned pour les index de tableau ou haskey pour d'autres mappages.
Exemples
julia> @isdefined newvar
false
julia> newvar = 1
1
julia> @isdefined newvar
true
julia> function f()
println(@isdefined x)
x = 3
println(@isdefined x)
end
f (generic function with 1 method)
julia> f()
false
trueBase.convert — Functionconvert(T, x)Convertir x en une valeur de type T.
Si T est un type Integer, une InexactError sera levée si x n'est pas représentable par T, par exemple si x n'est pas de valeur entière, ou est en dehors de la plage supportée par T.
Exemples
julia> convert(Int, 3.0)
3
julia> convert(Int, 3.5)
ERROR: InexactError: Int64(3.5)
Stacktrace:
[...]Si T est un type AbstractFloat, alors il renverra la valeur la plus proche de x représentable par T. Inf est traité comme un ulp de plus que floatmax(T) pour déterminer le plus proche.
julia> x = 1/3
0.3333333333333333
julia> convert(Float32, x)
0.33333334f0
julia> convert(BigFloat, x)
0.333333333333333314829616256247390992939472198486328125Si T est un type de collection et x une collection, le résultat de convert(T, x) peut faire référence à tout ou partie de x.
julia> x = Int[1, 2, 3];
julia> y = convert(Vector{Int}, x);
julia> y === x
trueVoir aussi : round, trunc, oftype, reinterpret.
Base.promote — Functionpromote(xs...)Convertir tous les arguments en un type commun et les retourner tous (sous forme de tuple). Si aucun argument ne peut être converti, une erreur est levée.
Voir aussi : promote_type, promote_rule.
Exemples
julia> promote(Int8(1), Float16(4.5), Float32(4.1))
(1.0f0, 4.5f0, 4.1f0)
julia> promote_type(Int8, Float16, Float32)
Float32
julia> reduce(Base.promote_typejoin, (Int8, Float16, Float32))
Real
julia> promote(1, "x")
ERROR: promotion of types Int64 and String failed to change any arguments
[...]
julia> promote_type(Int, String)
AnyBase.oftype — Functionoftype(x, y)Convertir y au type de x, c'est-à-dire convert(typeof(x), y).
Exemples
julia> x = 4;
julia> y = 3.;
julia> oftype(x, y)
3
julia> oftype(y, x)
4.0Base.widen — Functionwiden(x)Si x est un type, retourne un type "plus grand", défini de sorte que les opérations arithmétiques + et - ne soient pas garanties de débordement ni de perte de précision pour toute combinaison de valeurs que le type x peut contenir.
Pour les types d'entiers à taille fixe inférieurs à 128 bits, widen retournera un type avec le double du nombre de bits.
Si x est une valeur, elle est convertie en widen(typeof(x)).
Exemples
julia> widen(Int32)
Int64
julia> widen(1.5f0)
1.5Base.identity — Functionidentity(x)La fonction identité. Renvoie son argument.
Voir aussi : one, oneunit, et I de LinearAlgebra.
Exemples
julia> identity("Eh bien, qu'attendiez-vous?")
"Eh bien, qu'attendiez-vous?"Core.WeakRef — TypeWeakRef(x)w = WeakRef(x) construit une référence faible à la valeur Julia x : bien que w contienne une référence à x, cela n'empêche pas x d'être collecté par le ramasse-miettes. w.value est soit x (si x n'a pas encore été collecté), soit nothing (si x a été collecté).
julia> x = "a string"
"a string"
julia> w = WeakRef(x)
WeakRef("a string")
julia> GC.gc()
julia> w # une référence est maintenue via `x`
WeakRef("a string")
julia> x = nothing # effacer la référence
julia> GC.gc()
julia> w
WeakRef(nothing)Properties of Types
Type relations
Base.supertype — Functionsupertype(T::DataType)Retourne le supertype du DataType T.
Exemples
julia> supertype(Int32)
SignedCore.Type — TypeCore.Type{T}Core.Type est un type abstrait qui a tous les objets de type comme ses instances. La seule instance du type singleton Core.Type{T} est l'objet T.
Exemples
julia> isa(Type{Float64}, Type)
true
julia> isa(Float64, Type)
true
julia> isa(Real, Type{Float64})
false
julia> isa(Real, Type{Real})
trueCore.DataType — TypeDataType <: Type{T}DataType représente des types déclarés explicitement qui ont des noms, des supertypes déclarés explicitement et, éventuellement, des paramètres. Chaque valeur concrète dans le système est une instance de quelque DataType.
Exemples
julia> typeof(Real)
DataType
julia> typeof(Int)
DataType
julia> struct Point
x::Int
y
end
julia> typeof(Point)
DataTypeCore.:<: — Function<:(T1, T2)Opérateur de sous-type : renvoie true si et seulement si toutes les valeurs de type T1 sont également de type T2.
Exemples
julia> Float64 <: AbstractFloat
true
julia> Vector{Int} <: AbstractArray
true
julia> Matrix{Float64} <: Matrix{AbstractFloat}
falseBase.:>: — Function>:(T1, T2)Opérateur de supertype, équivalent à T2 <: T1.
Base.typejoin — Functiontypejoin(T, S, ...)Renvoie l'ancêtre commun le plus proche des types T et S, c'est-à-dire le type le plus étroit dont ils héritent tous les deux. Récursive sur des varargs supplémentaires.
Exemples
julia> typejoin(Int, Float64)
Real
julia> typejoin(Int, Float64, ComplexF32)
NumberBase.typeintersect — Functiontypeintersect(T::Type, S::Type)Calcule un type qui contient l'intersection de T et S. En général, ce sera le plus petit type de ce type ou un proche de celui-ci.
Un cas spécial où un comportement exact est garanti : lorsque T <: S, typeintersect(S, T) == T == typeintersect(T, S).
Base.promote_type — Functionpromote_type(type1, type2, ...)La promotion fait référence à la conversion de valeurs de types mixtes en un type commun unique. promote_type représente le comportement de promotion par défaut dans Julia lorsque des opérateurs (généralement mathématiques) reçoivent des arguments de types différents. promote_type essaie généralement de renvoyer un type qui peut au moins approcher la plupart des valeurs de l'un ou l'autre type d'entrée sans élargir excessivement. Une certaine perte est tolérée ; par exemple, promote_type(Int64, Float64) renvoie Float64 même si, strictement, toutes les valeurs Int64 ne peuvent pas être représentées exactement comme des valeurs Float64.
Voir aussi : promote, promote_typejoin, promote_rule.
Exemples
julia> promote_type(Int64, Float64)
Float64
julia> promote_type(Int32, Int64)
Int64
julia> promote_type(Float32, BigInt)
BigFloat
julia> promote_type(Int16, Float16)
Float16
julia> promote_type(Int64, Float16)
Float16
julia> promote_type(Int8, UInt16)
UInt16Pour surcharger la promotion pour vos propres types, vous devez surcharger promote_rule. promote_type appelle promote_rule en interne pour déterminer le type. Surcharger promote_type directement peut entraîner des erreurs d'ambiguïté.
Base.promote_rule — Functionpromote_rule(type1, type2)Spécifie quel type doit être utilisé par promote lorsqu'il reçoit des valeurs des types type1 et type2. Cette fonction ne doit pas être appelée directement, mais des définitions doivent y être ajoutées pour de nouveaux types si nécessaire.
Base.promote_typejoin — Functionpromote_typejoin(T, S)Calcule un type qui contient à la fois T et S, qui pourrait être soit un parent des deux types, soit un Union si approprié. Fait appel à typejoin en cas de besoin.
Voir aussi promote, promote_type.
Exemples
julia> Base.promote_typejoin(Int, Float64)
Real
julia> Base.promote_type(Int, Float64)
Float64Base.isdispatchtuple — Functionisdispatchtuple(T)Déterminez si le type T est un "type feuille" de tuple, ce qui signifie qu'il pourrait apparaître comme une signature de type dans le dispatch et n'a pas de sous-types (ou super-types) qui pourraient apparaître dans un appel. Si T n'est pas un type, alors retournez false.
Declared structure
Base.ismutable — Functionismutable(v) -> BoolRetourne true si et seulement si la valeur v est mutable. Voir Types composites mutables pour une discussion sur l'immuabilité. Notez que cette fonction fonctionne sur des valeurs, donc si vous lui donnez un DataType, elle vous dira qu'une valeur de ce type est mutable.
Pour des raisons techniques, ismutable retourne true pour des valeurs de certains types spéciaux (par exemple String et Symbol) même s'ils ne peuvent pas être mutés de manière permise.
Voir aussi isbits, isstructtype.
Exemples
julia> ismutable(1)
false
julia> ismutable([1,2])
trueCette fonction nécessite au moins Julia 1.5.
Base.isimmutable — Functionisimmutable(v) -> BoolEnvisagez d'utiliser !ismutable(v) à la place, car isimmutable(v) sera remplacé par !ismutable(v) dans une future version. (Depuis Julia 1.5)
Retourne true si et seulement si la valeur v est immuable. Voir Mutable Composite Types pour une discussion sur l'immuabilité. Notez que cette fonction fonctionne sur des valeurs, donc si vous lui donnez un type, elle vous dira qu'une valeur de DataType est mutable.
Exemples
julia> isimmutable(1)
true
julia> isimmutable([1,2])
falseBase.ismutabletype — Functionismutabletype(T) -> BoolDéterminez si le type T a été déclaré comme un type mutable (c'est-à-dire en utilisant le mot-clé mutable struct). Si T n'est pas un type, alors renvoyez false.
Cette fonction nécessite au moins Julia 1.7.
Base.isabstracttype — Functionisabstracttype(T)Déterminez si le type T a été déclaré comme un type abstrait (c'est-à-dire en utilisant la syntaxe abstract type). Notez que ce n'est pas la négation de isconcretetype(T). Si T n'est pas un type, alors renvoyez false.
Exemples
julia> isabstracttype(AbstractArray)
true
julia> isabstracttype(Vector)
falseBase.isprimitivetype — Functionisprimitivetype(T) -> BoolDéterminez si le type T a été déclaré comme un type primitif (c'est-à-dire en utilisant la syntaxe primitive type). Si T n'est pas un type, alors retournez false.
Base.issingletontype — FunctionBase.issingletontype(T)Déterminez si le type T a exactement une instance possible ; par exemple, un type de structure sans champs sauf d'autres valeurs singleton. Si T n'est pas un type concret, alors renvoyez false.
Base.isstructtype — Functionisstructtype(T) -> BoolDéterminez si le type T a été déclaré comme un type struct (c'est-à-dire en utilisant le mot-clé struct ou mutable struct). Si T n'est pas un type, alors renvoyez false.
Base.nameof — Methodnameof(t::DataType) -> SymbolObtenez le nom d'un DataType (potentiellement enveloppé dans UnionAll) (sans son module parent) sous forme de symbole.
Exemples
julia> module Foo
struct S{T}
end
end
Foo
julia> nameof(Foo.S{T} where T)
:SBase.fieldnames — Functionfieldnames(x::DataType)Obtenez un tuple avec les noms des champs d'un DataType.
Voir aussi propertynames, hasfield.
Exemples
julia> fieldnames(Rational)
(:num, :den)
julia> fieldnames(typeof(1+im))
(:re, :im)Base.fieldname — Functionfieldname(x::DataType, i::Integer)Obtenez le nom du champ i d'un DataType.
Exemples
julia> fieldname(Rational, 1)
:num
julia> fieldname(Rational, 2)
:denCore.fieldtype — Functionfieldtype(T, name::Symbol | index::Int)Déterminez le type déclaré d'un champ (spécifié par le nom ou l'index) dans un DataType composite T.
Exemples
julia> struct Foo
x::Int64
y::String
end
julia> fieldtype(Foo, :x)
Int64
julia> fieldtype(Foo, 2)
StringBase.fieldtypes — Functionfieldtypes(T::Type)Les types déclarés de tous les champs dans un DataType composite T sous forme de tuple.
Cette fonction nécessite au moins Julia 1.1.
Exemples
julia> struct Foo
x::Int64
y::String
end
julia> fieldtypes(Foo)
(Int64, String)Base.fieldcount — Functionfieldcount(t::Type)Obtenez le nombre de champs qu'une instance du type donné aurait. Une erreur est levée si le type est trop abstrait pour déterminer cela.
Base.hasfield — Functionhasfield(T::Type, name::Symbol)Renvoie un booléen indiquant si T a name comme l'un de ses propres champs.
Voir aussi fieldnames, fieldcount, hasproperty.
Cette fonction nécessite au moins Julia 1.2.
Exemples
julia> struct Foo
bar::Int
end
julia> hasfield(Foo, :bar)
true
julia> hasfield(Foo, :x)
falseCore.nfields — Functionnfields(x) -> IntObtenez le nombre de champs dans l'objet donné.
Exemples
julia> a = 1//2;
julia> nfields(a)
2
julia> b = 1
1
julia> nfields(b)
0
julia> ex = ErrorException("J'ai fait une mauvaise chose");
julia> nfields(ex)
1Dans ces exemples, a est un Rational, qui a deux champs. b est un Int, qui est un type de bit primitif sans champs du tout. ex est un ErrorException, qui a un champ.
Base.isconst — Functionisconst(m::Module, s::Symbol) -> BoolDéterminez si une variable globale est déclarée const dans un module donné m.
isconst(t::DataType, s::Union{Int,Symbol}) -> BoolDéterminez si un champ s est déclaré const dans un type donné t.
Base.isfieldatomic — Functionisfieldatomic(t::DataType, s::Union{Int,Symbol}) -> BoolDéterminez si un champ s est déclaré @atomic dans un type donné t.
Memory layout
Base.sizeof — Methodsizeof(T::DataType)
sizeof(obj)Taille, en octets, de la représentation binaire canonique du DataType donné T, le cas échéant. Ou la taille, en octets, de l'objet obj s'il n'est pas un DataType.
Voir aussi Base.summarysize.
Exemples
julia> sizeof(Float32)
4
julia> sizeof(ComplexF64)
16
julia> sizeof(1.0)
8
julia> sizeof(collect(1.0:10.0))
80
julia> struct StructWithPadding
x::Int64
flag::Bool
end
julia> sizeof(StructWithPadding) # pas la somme de `sizeof` des champs en raison du remplissage
16
julia> sizeof(Int64) + sizeof(Bool) # différent de ci-dessus
9Si le DataType T n'a pas de taille spécifique, une erreur est levée.
julia> sizeof(AbstractArray)
ERROR: Le type abstrait AbstractArray n'a pas de taille définie.
Stacktrace:
[...]Base.isconcretetype — Functionisconcretetype(T)Déterminez si le type T est un type concret, ce qui signifie qu'il pourrait avoir des instances directes (valeurs x telles que typeof(x) === T). Notez que ce n'est pas la négation de isabstracttype(T). Si T n'est pas un type, alors renvoyez false.
Voir aussi : isbits, isabstracttype, issingletontype.
Exemples
julia> isconcretetype(Complex)
false
julia> isconcretetype(Complex{Float32})
true
julia> isconcretetype(Vector{Complex})
true
julia> isconcretetype(Vector{Complex{Float32}})
true
julia> isconcretetype(Union{})
false
julia> isconcretetype(Union{Int,String})
falseBase.isbits — Functionisbits(x)Retourne true si x est une instance d'un type isbitstype.
Base.isbitstype — Functionisbitstype(T)Retourne true si le type T est un type de "données simples", ce qui signifie qu'il est immuable et ne contient aucune référence à d'autres valeurs, seulement des types primitifs et d'autres types isbitstype. Des exemples typiques sont les types numériques tels que UInt8, Float64 et Complex{Float64}. Cette catégorie de types est significative car elle est valide en tant que paramètres de type, peut ne pas suivre l'état isdefined / isassigned, et a une disposition définie qui est compatible avec C. Si T n'est pas un type, alors retourne false.
Voir aussi isbits, isprimitivetype, ismutable.
Exemples
julia> isbitstype(Complex{Float64})
true
julia> isbitstype(Complex)
falseBase.fieldoffset — Functionfieldoffset(type, i)Le décalage en octets du champ i d'un type par rapport au début des données. Par exemple, nous pourrions l'utiliser de la manière suivante pour résumer des informations sur une structure :
julia> structinfo(T) = [(fieldoffset(T,i), fieldname(T,i), fieldtype(T,i)) for i = 1:fieldcount(T)];
julia> structinfo(Base.Filesystem.StatStruct)
13-element Vector{Tuple{UInt64, Symbol, Type}}:
(0x0000000000000000, :desc, Union{RawFD, String})
(0x0000000000000008, :device, UInt64)
(0x0000000000000010, :inode, UInt64)
(0x0000000000000018, :mode, UInt64)
(0x0000000000000020, :nlink, Int64)
(0x0000000000000028, :uid, UInt64)
(0x0000000000000030, :gid, UInt64)
(0x0000000000000038, :rdev, UInt64)
(0x0000000000000040, :size, Int64)
(0x0000000000000048, :blksize, Int64)
(0x0000000000000050, :blocks, Int64)
(0x0000000000000058, :mtime, Float64)
(0x0000000000000060, :ctime, Float64)Base.datatype_alignment — FunctionBase.datatype_alignment(dt::DataType) -> IntAlignement minimum de l'allocation mémoire pour les instances de ce type. Peut être appelé sur tout isconcretetype, bien que pour Memory, il donnera l'alignement des éléments, et non de l'objet entier.
Base.datatype_haspadding — FunctionBase.datatype_haspadding(dt::DataType) -> BoolRenvoie si les champs des instances de ce type sont regroupés en mémoire, sans bits de remplissage intermédiaires (définis comme des bits dont la valeur n'impacte pas de manière unique le test d'égalité lorsqu'il est appliqué aux champs de la structure). Peut être appelé sur tout isconcretetype.
Base.datatype_pointerfree — FunctionBase.datatype_pointerfree(dt::DataType) -> BoolRenvoie si les instances de ce type peuvent contenir des références à la mémoire gérée par le GC. Peut être appelé sur tout isconcretetype.
Special values
Base.typemin — Functiontypemin(T)La plus basse valeur représentable par le type de données numériques (réel) donné T.
Voir aussi : floatmin, typemax, eps.
Exemples
julia> typemin(Int8)
-128
julia> typemin(UInt32)
0x00000000
julia> typemin(Float16)
-Inf16
julia> typemin(Float32)
-Inf32
julia> nextfloat(-Inf32) # plus petit nombre à virgule flottante Float32 fini
-3.4028235f38Base.typemax — Functiontypemax(T)La valeur la plus élevée représentable par le DataType numérique (réel) donné.
Voir aussi : floatmax, typemin, eps.
Exemples
julia> typemax(Int8)
127
julia> typemax(UInt32)
0xffffffff
julia> typemax(Float64)
Inf
julia> typemax(Float32)
Inf32
julia> floatmax(Float32) # plus grand nombre à virgule flottante Finie Float32
3.4028235f38Base.floatmin — Functionfloatmin(T = Float64)Renvoie le plus petit nombre normal positif représentable par le type à virgule flottante T.
Exemples
julia> floatmin(Float16)
Float16(6.104e-5)
julia> floatmin(Float32)
1.1754944f-38
julia> floatmin()
2.2250738585072014e-308Base.floatmax — Functionfloatmax(T = Float64)Renvoie le plus grand nombre fini représentable par le type à virgule flottante T.
Voir aussi : typemax, floatmin, eps.
Exemples
julia> floatmax(Float16)
Float16(6.55e4)
julia> floatmax(Float32)
3.4028235f38
julia> floatmax()
1.7976931348623157e308
julia> typemax(Float64)
InfBase.maxintfloat — Functionmaxintfloat(T=Float64)Le plus grand nombre à virgule flottante de valeur entière consécutive qui est exactement représenté dans le type de virgule flottante donné T (qui par défaut est Float64).
C'est-à-dire que maxintfloat renvoie le plus petit nombre à virgule flottante de valeur entière positive n tel que n+1 n'est pas exactement représentable dans le type T.
Lorsqu'une valeur de type Integer est nécessaire, utilisez Integer(maxintfloat(T)).
maxintfloat(T, S)Le plus grand entier consécutif représentable dans le type de flottant donné T qui ne dépasse pas non plus l'entier maximum représentable par le type entier S. En d'autres termes, c'est le minimum de maxintfloat(T) et de typemax(S).
Base.eps — Methodeps(::Type{T}) where T<:AbstractFloat
eps()Renvoie le epsilon machine du type à virgule flottante T (T = Float64 par défaut). Cela est défini comme l'écart entre 1 et la valeur suivante la plus grande représentable par typeof(one(T)), et est équivalent à eps(one(T)). (Puisque eps(T) est une limite sur l'erreur relative de T, c'est une quantité "sans dimension" comme one.)
Exemples
julia> eps()
2.220446049250313e-16
julia> eps(Float32)
1.1920929f-7
julia> 1.0 + eps()
1.0000000000000002
julia> 1.0 + eps()/2
1.0Base.eps — Methodeps(x::AbstractFloat)Retourne l'unité dans la dernière place (ulp) de x. C'est la distance entre les valeurs flottantes représentables consécutives à x. Dans la plupart des cas, si la distance de chaque côté de x est différente, alors la plus grande des deux est prise, c'est-à-dire
eps(x) == max(x-prevfloat(x), nextfloat(x)-x)Les exceptions à cette règle sont les plus petites et les plus grandes valeurs finies (par exemple, nextfloat(-Inf) et prevfloat(Inf) pour Float64), qui arrondissent à la plus petite des valeurs.
La raison de ce comportement est que eps borne l'erreur d'arrondi en virgule flottante. Sous le mode d'arrondi par défaut RoundNearest, si $y$ est un nombre réel et $x$ est le nombre en virgule flottante le plus proche de $y$, alors
\[|y-x| \leq \operatorname{eps}(x)/2.\]
Voir aussi : nextfloat, issubnormal, floatmax.
Exemples
julia> eps(1.0)
2.220446049250313e-16
julia> eps(prevfloat(2.0))
2.220446049250313e-16
julia> eps(2.0)
4.440892098500626e-16
julia> x = prevfloat(Inf) # plus grand Float64 fini
1.7976931348623157e308
julia> x + eps(x)/2 # arrondit vers le haut
Inf
julia> x + prevfloat(eps(x)/2) # arrondit vers le bas
1.7976931348623157e308Base.instances — Functioninstances(T::Type)Renvoie une collection de toutes les instances du type donné, si applicable. Principalement utilisé pour les types énumérés (voir @enum).
Exemples
julia> @enum Color red blue green
julia> instances(Color)
(red, blue, green)Special Types
Core.Any — TypeAny::DataTypeAny est l'union de tous les types. Il a la propriété définissante isa(x, Any) == true pour tout x. Any décrit donc l'ensemble de l'univers des valeurs possibles. Par exemple, Integer est un sous-ensemble de Any qui inclut Int, Int8, et d'autres types d'entiers.
Core.Union — TypeUnion{Types...}Un type Union est un type abstrait qui inclut toutes les instances de n'importe lequel de ses types d'argument. Cela signifie que T <: Union{T,S} et S <: Union{T,S}.
Comme d'autres types abstraits, il ne peut pas être instancié, même si tous ses arguments ne sont pas abstraits.
Exemples
julia> IntOrString = Union{Int,AbstractString}
Union{Int64, AbstractString}
julia> 1 isa IntOrString # une instance d'Int est incluse dans l'union
true
julia> "Hello!" isa IntOrString # String est également inclus
true
julia> 1.0 isa IntOrString # Float64 n'est pas inclus car il n'est ni Int ni AbstractString
falseAide Étendue
Contrairement à la plupart des autres types paramétriques, les unions sont covariantes dans leurs paramètres. Par exemple, Union{Real, String} est un sous-type de Union{Number, AbstractString}.
L'union vide Union{} est le type le plus bas de Julia.
Union{} — KeywordUnion{}Union{}, l'Union vide de types, est le type qui n'a pas de valeurs. C'est-à-dire qu'il a la propriété définissante isa(x, Union{}) == false pour tout x. Base.Bottom est défini comme son alias et le type de Union{} est Core.TypeofBottom.
Exemples
julia> isa(nothing, Union{})
falseCore.UnionAll — TypeUnionAllUne union de types sur toutes les valeurs d'un paramètre de type. UnionAll est utilisé pour décrire des types paramétriques où les valeurs de certains paramètres ne sont pas connues. Voir la section du manuel sur UnionAll Types.
Exemples
julia> typeof(Vector)
UnionAll
julia> typeof(Vector{Int})
DataTypeCore.Tuple — TypeTuple{Types...}Un tuple est un conteneur de longueur fixe qui peut contenir des valeurs de différents types, mais ne peut pas être modifié (il est immuable). Les valeurs peuvent être accessibles par indexation. Les littéraux de tuple sont écrits avec des virgules et des parenthèses :
julia> (1, 1+1)
(1, 2)
julia> (1,)
(1,)
julia> x = (0.0, "hello", 6*7)
(0.0, "hello", 42)
julia> x[2]
"hello"
julia> typeof(x)
Tuple{Float64, String, Int64}Un tuple de longueur 1 doit être écrit avec une virgule, (1,), car (1) serait simplement une valeur entre parenthèses. () représente le tuple vide (de longueur 0).
Un tuple peut être construit à partir d'un itérateur en utilisant un type Tuple comme constructeur :
julia> Tuple(["a", 1])
("a", 1)
julia> Tuple{String, Float64}(["a", 1])
("a", 1.0)Les types de tuple sont covariants dans leurs paramètres : Tuple{Int} est un sous-type de Tuple{Any}. Par conséquent, Tuple{Any} est considéré comme un type abstrait, et les types de tuple ne sont concrets que si leurs paramètres le sont. Les tuples n'ont pas de noms de champ ; les champs ne sont accessibles que par index. Les types de tuple peuvent avoir n'importe quel nombre de paramètres.
Voir la section du manuel sur Tuple Types.
Voir aussi Vararg, NTuple, ntuple, tuple, NamedTuple.
Core.NTuple — TypeNTuple{N, T}Une manière compacte de représenter le type d'un tuple de longueur N où tous les éléments sont de type T.
Exemples
julia> isa((1, 2, 3, 4, 5, 6), NTuple{6, Int})
trueVoir aussi ntuple.
Core.NamedTuple — TypeNamedTupleLes NamedTuple sont, comme leur nom l'indique, des Tuple nommés. C'est-à-dire qu'ils constituent une collection de valeurs semblable à un tuple, où chaque entrée a un nom unique, représenté sous la forme d'un Symbol. Comme les Tuple, les NamedTuple sont immuables ; ni les noms ni les valeurs ne peuvent être modifiés sur place après leur construction.
Un tuple nommé peut être créé comme un littéral de tuple avec des clés, par exemple (a=1, b=2), ou comme un littéral de tuple avec un point-virgule après la parenthèse d'ouverture, par exemple (; a=1, b=2) (cette forme accepte également des noms générés par programme comme décrit ci-dessous), ou en utilisant un type NamedTuple comme constructeur, par exemple NamedTuple{(:a, :b)}((1,2)).
L'accès à la valeur associée à un nom dans un tuple nommé peut se faire en utilisant la syntaxe d'accès aux champs, par exemple x.a, ou en utilisant getindex, par exemple x[:a] ou x[(:a, :b)]. Un tuple des noms peut être obtenu en utilisant keys, et un tuple des valeurs peut être obtenu en utilisant values.
L'itération sur les NamedTuple produit les valeurs sans les noms. (Voir l'exemple ci-dessous.) Pour itérer sur les paires nom-valeur, utilisez la fonction pairs.
Le macro @NamedTuple peut être utilisé pour déclarer commodément des types NamedTuple.
Exemples
julia> x = (a=1, b=2)
(a = 1, b = 2)
julia> x.a
1
julia> x[:a]
1
julia> x[(:a,)]
(a = 1,)
julia> keys(x)
(:a, :b)
julia> values(x)
(1, 2)
julia> collect(x)
2-element Vector{Int64}:
1
2
julia> collect(pairs(x))
2-element Vector{Pair{Symbol, Int64}}:
:a => 1
:b => 2De la même manière que l'on peut définir des arguments de mots-clés par programme, un tuple nommé peut être créé en donnant des paires name::Symbol => value après un point-virgule à l'intérieur d'un littéral de tuple. Cette syntaxe et la syntaxe name=value peuvent être mélangées :
julia> (; :a => 1, :b => 2, c=3)
(a = 1, b = 2, c = 3)Les paires nom-valeur peuvent également être fournies en splattant un tuple nommé ou tout itérateur qui produit des collections à deux valeurs contenant chacune un symbole comme première valeur :
julia> keys = (:a, :b, :c); values = (1, 2, 3);
julia> NamedTuple{keys}(values)
(a = 1, b = 2, c = 3)
julia> (; (keys .=> values)...)
(a = 1, b = 2, c = 3)
julia> nt1 = (a=1, b=2);
julia> nt2 = (c=3, d=4);
julia> (; nt1..., nt2..., b=20) # le dernier b écrase la valeur de nt1
(a = 1, b = 20, c = 3, d = 4)
julia> (; zip(keys, values)...) # zip produit des tuples tels que (:a, 1)
(a = 1, b = 2, c = 3)Comme pour les arguments de mots-clés, les identifiants et les expressions à point indiquent des noms :
julia> x = 0
0
julia> t = (; x)
(x = 0,)
julia> (; t.x)
(x = 0,)Les noms implicites provenant des identifiants et des expressions à point sont disponibles depuis Julia 1.5.
L'utilisation des méthodes getindex avec plusieurs Symbols est disponible depuis Julia 1.7.
Base.@NamedTuple — Macro@NamedTuple{key1::Type1, key2::Type2, ...}
@NamedTuple begin key1::Type1; key2::Type2; ...; endCette macro offre une syntaxe plus pratique pour déclarer des types NamedTuple. Elle renvoie un type NamedTuple avec les clés et types donnés, équivalent à NamedTuple{(:key1, :key2, ...), Tuple{Type1,Type2,...}}. Si la déclaration ::Type est omise, elle est considérée comme Any. La forme begin ... end permet de répartir les déclarations sur plusieurs lignes (similaire à une déclaration struct), mais est autrement équivalente. La macro NamedTuple est utilisée lors de l'impression des types NamedTuple dans par exemple le REPL.
Par exemple, le tuple (a=3.1, b="hello") a un type NamedTuple{(:a, :b), Tuple{Float64, String}}, qui peut également être déclaré via @NamedTuple comme suit :
julia> @NamedTuple{a::Float64, b::String}
@NamedTuple{a::Float64, b::String}
julia> @NamedTuple begin
a::Float64
b::String
end
@NamedTuple{a::Float64, b::String}Cette macro est disponible depuis Julia 1.5.
Base.@Kwargs — Macro@Kwargs{key1::Type1, key2::Type2, ...}Ce macro offre un moyen pratique de construire la représentation de type des arguments de mot-clé à partir de la même syntaxe que @NamedTuple. Par exemple, lorsque nous avons un appel de fonction comme func([arguments positionnels]; kw1=1.0, kw2="2"), nous pouvons utiliser ce macro pour construire la représentation interne de type des arguments de mot-clé comme @Kwargs{kw1::Float64, kw2::String}. La syntaxe du macro est spécifiquement conçue pour simplifier le type de signature d'une méthode de mot-clé lorsqu'elle est imprimée dans la vue de trace de pile.
julia> @Kwargs{init::Int} # la représentation interne des arguments de mot-clé
Base.Pairs{Symbol, Int64, Tuple{Symbol}, @NamedTuple{init::Int64}}
julia> sum("julia"; init=1)
ERROR: MethodError: no method matching +(::Char, ::Char)
La fonction `+` existe, mais aucune méthode n'est définie pour cette combinaison de types d'arguments.
Les candidats les plus proches sont :
+(::Any, ::Any, ::Any, ::Any...)
@ Base operators.jl:585
+(::Integer, ::AbstractChar)
@ Base char.jl:247
+(::T, ::Integer) où T<:AbstractChar
@ Base char.jl:237
Trace de la pile :
[1] add_sum(x::Char, y::Char)
@ Base ./reduce.jl:24
[2] BottomRF
@ Base ./reduce.jl:86 [inlined]
[3] _foldl_impl(op::Base.BottomRF{typeof(Base.add_sum)}, init::Int64, itr::String)
@ Base ./reduce.jl:62
[4] foldl_impl(op::Base.BottomRF{typeof(Base.add_sum)}, nt::Int64, itr::String)
@ Base ./reduce.jl:48 [inlined]
[5] mapfoldl_impl(f::typeof(identity), op::typeof(Base.add_sum), nt::Int64, itr::String)
@ Base ./reduce.jl:44 [inlined]
[6] mapfoldl(f::typeof(identity), op::typeof(Base.add_sum), itr::String; init::Int64)
@ Base ./reduce.jl:175 [inlined]
[7] mapreduce(f::typeof(identity), op::typeof(Base.add_sum), itr::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:307 [inlined]
[8] sum(f::typeof(identity), a::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:535 [inlined]
[9] sum(a::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:564 [inlined]
[10] top-level scope
@ REPL[12]:1Ce macro est disponible depuis Julia 1.10.
Base.Val — TypeVal(c)Retourne Val{c}(), qui ne contient aucune donnée d'exécution. Des types comme celui-ci peuvent être utilisés pour passer l'information entre les fonctions à travers la valeur c, qui doit être une valeur isbits ou un Symbol. L'intention de cette construction est de pouvoir dispatcher sur des constantes directement (au moment de la compilation) sans avoir à tester la valeur de la constante à l'exécution.
Exemples
julia> f(::Val{true}) = "Good"
f (generic function with 1 method)
julia> f(::Val{false}) = "Bad"
f (generic function with 2 methods)
julia> f(Val(true))
"Good"Core.Vararg — ConstantVararg{T,N}Le dernier paramètre d'un type de tuple Tuple peut être la valeur spéciale Vararg, qui désigne un nombre quelconque d'éléments en fin de liste. Vararg{T,N} correspond exactement à N éléments de type T. Enfin, Vararg{T} correspond à zéro ou plusieurs éléments de type T. Les types de tuple Vararg sont utilisés pour représenter les arguments acceptés par les méthodes varargs (voir la section sur Fonctions Varargs dans le manuel.)
Voir aussi NTuple.
Exemples
julia> mytupletype = Tuple{AbstractString, Vararg{Int}}
Tuple{AbstractString, Vararg{Int64}}
julia> isa(("1",), mytupletype)
true
julia> isa(("1",1), mytupletype)
true
julia> isa(("1",1,2), mytupletype)
true
julia> isa(("1",1,2,3.0), mytupletype)
falseCore.Nothing — TypeBase.isnothing — Functionisnothing(x)Retourne true si x === nothing, et retourne false sinon.
Cette fonction nécessite au moins Julia 1.1.
Voir aussi something, Base.notnothing, ismissing.
Base.notnothing — Functionnotnothing(x)Lance une erreur si x === nothing, et retourne x sinon.
Base.Some — TypeSome{T}Un type d'enveloppe utilisé dans Union{Some{T}, Nothing} pour distinguer l'absence d'une valeur (nothing) et la présence d'une valeur nothing (c'est-à-dire Some(nothing)).
Utilisez something pour accéder à la valeur enveloppée par un objet Some.
Base.something — Functionsomething(x...)Retourne la première valeur dans les arguments qui n'est pas égale à nothing, le cas échéant. Sinon, lance une erreur. Les arguments de type Some sont déballés.
Voir aussi coalesce, skipmissing, @something.
Exemples
julia> something(nothing, 1)
1
julia> something(Some(1), nothing)
1
julia> something(Some(nothing), 2) === nothing
true
julia> something(missing, nothing)
missing
julia> something(nothing, nothing)
ERROR: ArgumentError: No value arguments presentBase.@something — Macro@something(x...)Version à court-circuit de something.
Exemples
julia> f(x) = (println("f($x)"); nothing);
julia> a = 1;
julia> a = @something a f(2) f(3) error("Impossible de trouver une valeur par défaut pour `a`")
1
julia> b = nothing;
julia> b = @something b f(2) f(3) error("Impossible de trouver une valeur par défaut pour `b`")
f(2)
f(3)
ERREUR: Impossible de trouver une valeur par défaut pour `b`
[...]
julia> b = @something b f(2) f(3) Some(nothing)
f(2)
f(3)
julia> b === nothing
trueCe macro est disponible depuis Julia 1.7.
Base.Enums.Enum — TypeEnum{T<:Integer}Le supertype abstrait de tous les types énumérés définis avec @enum.
Base.Enums.@enum — Macro@enum EnumName[::BaseType] value1[=x] value2[=y]Créez un sous-type Enum{BaseType} avec le nom EnumName et des valeurs de membre d'énumération value1 et value2 avec des valeurs assignées optionnelles x et y, respectivement. EnumName peut être utilisé comme d'autres types et les valeurs de membre d'énumération comme des valeurs régulières, telles que
Exemples
julia> @enum Fruit apple=1 orange=2 kiwi=3
julia> f(x::Fruit) = "Je suis un Fruit avec la valeur : $(Int(x))"
f (fonction générique avec 1 méthode)
julia> f(apple)
"Je suis un Fruit avec la valeur : 1"
julia> Fruit(1)
apple::Fruit = 1Les valeurs peuvent également être spécifiées à l'intérieur d'un bloc begin, par exemple
@enum EnumName begin
value1
value2
endBaseType, qui par défaut est Int32, doit être un sous-type primitif de Integer. Les valeurs de membre peuvent être converties entre le type d'énumération et BaseType. read et write effectuent ces conversions automatiquement. Dans le cas où l'énumération est créée avec un BaseType non par défaut, Integer(value1) renverra l'entier value1 avec le type BaseType.
Pour lister toutes les instances d'une énumération, utilisez instances, par exemple
julia> instances(Fruit)
(apple, orange, kiwi)Il est possible de construire un symbole à partir d'une instance d'énumération :
julia> Symbol(apple)
:appleCore.Expr — TypeExpr(head::Symbol, args...)Un type représentant des expressions composées dans le code julia analysé (ASTs). Chaque expression se compose d'un head Symbol identifiant quel type d'expression il s'agit (par exemple, un appel, une boucle for, une instruction conditionnelle, etc.), et de sous-expressions (par exemple, les arguments d'un appel). Les sous-expressions sont stockées dans un champ Vector{Any} appelé args.
Voir le chapitre du manuel sur Metaprogramming et la documentation des développeurs Julia ASTs.
Exemples
julia> Expr(:call, :+, 1, 2)
:(1 + 2)
julia> dump(:(a ? b : c))
Expr
head: Symbol if
args: Array{Any}((3,))
1: Symbol a
2: Symbol b
3: Symbol cCore.Symbol — TypeSymboleLe type d'objet utilisé pour représenter des identifiants dans le code julia analysé (ASTs). Utilisé également souvent comme un nom ou une étiquette pour identifier une entité (par exemple, comme clé de dictionnaire). Les Symbols peuvent être saisis en utilisant l'opérateur de citation : :
julia> :name
:name
julia> typeof(:name)
Symbol
julia> x = 42
42
julia> eval(:x)
42Les Symbols peuvent également être construits à partir de chaînes de caractères ou d'autres valeurs en appelant le constructeur Symbol(x...).
Les Symbols sont immuables et leur implémentation réutilise le même objet pour tous les Symbols ayant le même nom.
Contrairement aux chaînes de caractères, les Symbols sont des entités "atomiques" ou "scalaires" qui ne prennent pas en charge l'itération sur les caractères.
Core.Symbol — MethodSymbol(x...) -> SymbolCréez un Symbol en concaténant les représentations sous forme de chaîne des arguments.
Exemples
julia> Symbol("my", "name")
:myname
julia> Symbol("day", 4)
:day4Core.Module — TypeModuleUn Module est un espace de travail de variables globales séparé. Voir module et la section du manuel sur les modules pour plus de détails.
Module(name::Symbol=:anonymous, std_imports=true, default_names=true)Retourne un module avec le nom spécifié. Un baremodule correspond à Module(:ModuleName, false)
Un module vide ne contenant aucun nom peut être créé avec Module(:ModuleName, false, false). Ce module n'importera ni Base ni Core et ne contient pas de référence à lui-même.
Generic Functions
Core.Function — TypeFonctionType abstrait de toutes les fonctions.
Exemples
julia> isa(+, Function)
true
julia> typeof(sin)
typeof(sin) (type singleton de la fonction sin, sous-type de Function)
julia> ans <: Function
trueBase.hasmethod — Functionhasmethod(f, t::Type{<:Tuple}[, kwnames]; world=get_world_counter()) -> BoolDéterminez si la fonction générique donnée a une méthode correspondant au Tuple des types d'arguments donnés avec la limite supérieure de l'âge du monde donnée par world.
Si un tuple de noms d'arguments de mot-clé kwnames est fourni, cela vérifie également si la méthode de f correspondant à t a les noms d'arguments de mot-clé donnés. Si la méthode correspondante accepte un nombre variable d'arguments de mot-clé, par exemple avec kwargs..., tous les noms donnés dans kwnames sont considérés comme valides. Sinon, les noms fournis doivent être un sous-ensemble des arguments de mot-clé de la méthode.
Voir aussi applicable.
Fournir des noms d'arguments de mot-clé nécessite Julia 1.2 ou une version ultérieure.
Exemples
julia> hasmethod(length, Tuple{Array})
true
julia> f(; oranges=0) = oranges;
julia> hasmethod(f, Tuple{}, (:oranges,))
true
julia> hasmethod(f, Tuple{}, (:apples, :bananas))
false
julia> g(; xs...) = 4;
julia> hasmethod(g, Tuple{}, (:a, :b, :c, :d)) # g accepte des kwargs arbitraires
trueCore.applicable — Functionapplicable(f, args...) -> BoolDéterminez si la fonction générique donnée a une méthode applicable aux arguments donnés.
Voir aussi hasmethod.
Exemples
julia> function f(x, y)
x + y
end;
julia> applicable(f, 1)
false
julia> applicable(f, 1, 2)
trueBase.isambiguous — FunctionBase.isambiguous(m1, m2; ambiguous_bottom=false) -> BoolDétermine si deux méthodes m1 et m2 peuvent être ambiguës pour une certaine signature d'appel. Ce test est effectué dans le contexte d'autres méthodes de la même fonction ; isolément, m1 et m2 pourraient être ambiguës, mais si une troisième méthode résolvant l'ambiguïté a été définie, cela retourne false. Alternativement, isolément m1 et m2 pourraient être ordonnées, mais si une troisième méthode ne peut pas être triée avec elles, elles peuvent causer une ambiguïté ensemble.
Pour les types paramétriques, l'argument clé ambiguous_bottom contrôle si Union{} compte comme une intersection ambiguë de paramètres de type – lorsque true, il est considéré comme ambigu, lorsque false, il ne l'est pas.
Exemples
julia> foo(x::Complex{<:Integer}) = 1
foo (generic function with 1 method)
julia> foo(x::Complex{<:Rational}) = 2
foo (generic function with 2 methods)
julia> m1, m2 = collect(methods(foo));
julia> typeintersect(m1.sig, m2.sig)
Tuple{typeof(foo), Complex{Union{}}}
julia> Base.isambiguous(m1, m2, ambiguous_bottom=true)
true
julia> Base.isambiguous(m1, m2, ambiguous_bottom=false)
falseCore.invoke — Functioninvoke(f, argtypes::Type, args...; kwargs...)Invoquer une méthode pour la fonction générique donnée f correspondant aux types spécifiés argtypes sur les arguments spécifiés args et en passant les arguments de mot-clé kwargs. Les arguments args doivent être conformes aux types spécifiés dans argtypes, c'est-à-dire que la conversion n'est pas effectuée automatiquement. Cette méthode permet d'invoquer une méthode autre que la méthode la plus spécifique correspondante, ce qui est utile lorsque le comportement d'une définition plus générale est explicitement nécessaire (souvent dans le cadre de l'implémentation d'une méthode plus spécifique de la même fonction).
Soyez prudent lorsque vous utilisez invoke pour des fonctions que vous n'écrivez pas. Quelle définition est utilisée pour les argtypes donnés est un détail d'implémentation à moins que la fonction ne précise explicitement que l'appel avec certains argtypes fait partie de l'API publique. Par exemple, le changement entre f1 et f2 dans l'exemple ci-dessous est généralement considéré comme compatible car le changement est invisible pour l'appelant avec un appel normal (non-invoke). Cependant, le changement est visible si vous utilisez invoke.
Exemples
julia> f(x::Real) = x^2;
julia> f(x::Integer) = 1 + invoke(f, Tuple{Real}, x);
julia> f(2)
5
julia> f1(::Integer) = Integer
f1(::Real) = Real;
julia> f2(x::Real) = _f2(x)
_f2(::Integer) = Integer
_f2(_) = Real;
julia> f1(1)
Integer
julia> f2(1)
Integer
julia> invoke(f1, Tuple{Real}, 1)
Real
julia> invoke(f2, Tuple{Real}, 1)
IntegerBase.@invoke — Macro@invoke f(arg::T, ...; kwargs...)Fournit un moyen pratique d'appeler invoke en développant @invoke f(arg1::T1, arg2::T2; kwargs...) en invoke(f, Tuple{T1,T2}, arg1, arg2; kwargs...). Lorsqu'une annotation de type d'argument est omise, elle est remplacée par Core.Typeof de cet argument. Pour invoquer une méthode où un argument n'est pas typé ou est explicitement typé comme Any, annotez l'argument avec ::Any.
Il prend également en charge la syntaxe suivante :
@invoke (x::X).fse développe eninvoke(getproperty, Tuple{X,Symbol}, x, :f)@invoke (x::X).f = v::Vse développe eninvoke(setproperty!, Tuple{X,Symbol,V}, x, :f, v)@invoke (xs::Xs)[i::I]se développe eninvoke(getindex, Tuple{Xs,I}, xs, i)@invoke (xs::Xs)[i::I] = v::Vse développe eninvoke(setindex!, Tuple{Xs,V,I}, xs, v, i)
Exemples
julia> @macroexpand @invoke f(x::T, y)
:(Core.invoke(f, Tuple{T, Core.Typeof(y)}, x, y))
julia> @invoke 420::Integer % Unsigned
0x00000000000001a4
julia> @macroexpand @invoke (x::X).f
:(Core.invoke(Base.getproperty, Tuple{X, Core.Typeof(:f)}, x, :f))
julia> @macroexpand @invoke (x::X).f = v::V
:(Core.invoke(Base.setproperty!, Tuple{X, Core.Typeof(:f), V}, x, :f, v))
julia> @macroexpand @invoke (xs::Xs)[i::I]
:(Core.invoke(Base.getindex, Tuple{Xs, I}, xs, i))
julia> @macroexpand @invoke (xs::Xs)[i::I] = v::V
:(Core.invoke(Base.setindex!, Tuple{Xs, V, I}, xs, v, i))Ce macro nécessite Julia 1.7 ou une version ultérieure.
Ce macro est exporté à partir de Julia 1.9.
La syntaxe supplémentaire est prise en charge à partir de Julia 1.10.
Base.invokelatest — Functioninvokelatest(f, args...; kwargs...)Appelle f(args...; kwargs...), mais garantit que la méthode la plus récente de f sera exécutée. Cela est utile dans des circonstances spécialisées, par exemple dans des boucles d'événements de longue durée ou des fonctions de rappel qui peuvent appeler des versions obsolètes d'une fonction f. (L'inconvénient est que invokelatest est quelque peu plus lent que d'appeler f directement, et le type du résultat ne peut pas être inféré par le compilateur.)
Avant Julia 1.9, cette fonction n'était pas exportée et était appelée comme Base.invokelatest.
Base.@invokelatest — Macro@invokelatest f(args...; kwargs...)Fournit un moyen pratique d'appeler invokelatest. @invokelatest f(args...; kwargs...) sera simplement développé en Base.invokelatest(f, args...; kwargs...).
Il prend également en charge la syntaxe suivante :
@invokelatest x.fse développe enBase.invokelatest(getproperty, x, :f)@invokelatest x.f = vse développe enBase.invokelatest(setproperty!, x, :f, v)@invokelatest xs[i]se développe enBase.invokelatest(getindex, xs, i)@invokelatest xs[i] = vse développe enBase.invokelatest(setindex!, xs, v, i)
julia> @macroexpand @invokelatest f(x; kw=kwv)
:(Base.invokelatest(f, x; kw = kwv))
julia> @macroexpand @invokelatest x.f
:(Base.invokelatest(Base.getproperty, x, :f))
julia> @macroexpand @invokelatest x.f = v
:(Base.invokelatest(Base.setproperty!, x, :f, v))
julia> @macroexpand @invokelatest xs[i]
:(Base.invokelatest(Base.getindex, xs, i))
julia> @macroexpand @invokelatest xs[i] = v
:(Base.invokelatest(Base.setindex!, xs, v, i))Cette macro nécessite Julia 1.7 ou une version ultérieure.
Avant Julia 1.9, cette macro n'était pas exportée et était appelée comme Base.@invokelatest.
La syntaxe supplémentaire x.f et xs[i] nécessite Julia 1.10.
new — Keywordnew, ou new{A,B,...}Fonction spéciale disponible pour les constructeurs internes qui crée un nouvel objet du type. La forme new{A,B,...} spécifie explicitement les valeurs des paramètres pour les types paramétriques. Voir la section du manuel sur Inner Constructor Methods pour plus d'informations.
Base.:|> — Function|>(x, f)Opérateur infixe qui applique la fonction f à l'argument x. Cela permet d'écrire f(g(x)) sous la forme x |> g |> f. Lorsqu'il est utilisé avec des fonctions anonymes, des parenthèses sont généralement nécessaires autour de la définition pour obtenir la chaîne souhaitée.
Exemples
julia> 4 |> inv
0.25
julia> [2, 3, 5] |> sum |> inv
0.1
julia> [0 1; 2 3] .|> (x -> x^2) |> sum
14Base.:∘ — Functionf ∘ gComposer des fonctions : c'est-à-dire que (f ∘ g)(args...; kwargs...) signifie f(g(args...; kwargs...)). Le symbole ∘ peut être saisi dans le REPL Julia (et la plupart des éditeurs, correctement configurés) en tapant \circ<tab>.
La composition de fonctions fonctionne également sous forme préfixe : ∘(f, g) est la même chose que f ∘ g. La forme préfixe prend en charge la composition de plusieurs fonctions : ∘(f, g, h) = f ∘ g ∘ h et le splatting ∘(fs...) pour composer une collection itérable de fonctions. Le dernier argument de ∘ s'exécute en premier.
La composition de plusieurs fonctions nécessite au moins Julia 1.4.
La composition d'une seule fonction ∘(f) nécessite au moins Julia 1.5.
L'utilisation d'arguments de mot-clé nécessite au moins Julia 1.7.
Exemples
julia> map(uppercase∘first, ["apple", "banana", "carrot"])
3-element Vector{Char}:
'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)
'B': ASCII/Unicode U+0042 (category Lu: Letter, uppercase)
'C': ASCII/Unicode U+0043 (category Lu: Letter, uppercase)
julia> (==(6)∘length).(["apple", "banana", "carrot"])
3-element BitVector:
0
1
1
julia> fs = [
x -> 2x
x -> x-1
x -> x/2
x -> x+1
];
julia> ∘(fs...)(3)
2.0Voir aussi ComposedFunction, !f::Function.
Base.ComposedFunction — TypeComposedFunction{Outer,Inner} <: FunctionReprésente la composition de deux objets appelables outer::Outer et inner::Inner. C'est-à-dire
ComposedFunction(outer, inner)(args...; kw...) === outer(inner(args...; kw...))La manière préférée de construire une instance de ComposedFunction est d'utiliser l'opérateur de composition ∘ :
julia> sin ∘ cos === ComposedFunction(sin, cos)
true
julia> typeof(sin∘cos)
ComposedFunction{typeof(sin), typeof(cos)}Les pièces composées sont stockées dans les champs de ComposedFunction et peuvent être récupérées comme suit :
julia> composition = sin ∘ cos
sin ∘ cos
julia> composition.outer === sin
true
julia> composition.inner === cos
trueComposedFunction nécessite au moins Julia 1.6. Dans les versions antérieures, ∘ renvoie une fonction anonyme à la place.
Voir aussi ∘.
Base.splat — Functionsplat(f)Équivalent à
my_splat(f) = args->f(args...)c'est-à-dire qu'étant donné une fonction, cela renvoie une nouvelle fonction qui prend un argument et le décompose dans la fonction originale. Cela est utile comme adaptateur pour passer une fonction à plusieurs arguments dans un contexte qui attend un seul argument, mais passe un tuple comme cet argument unique.
Exemples
julia> map(splat(+), zip(1:3,4:6))
3-element Vector{Int64}:
5
7
9
julia> my_add = splat(+)
splat(+)
julia> my_add((1,2,3))
6Base.Fix1 — TypeFix1(f, x)Un type représentant une version partiellement appliquée de la fonction à deux arguments f, avec le premier argument fixé à la valeur "x". En d'autres termes, Fix1(f, x) se comporte de manière similaire à y->f(x, y).
Voir aussi Fix2.
Base.Fix2 — TypeFix2(f, x)Un type représentant une version partiellement appliquée de la fonction à deux arguments f, avec le deuxième argument fixé à la valeur "x". En d'autres termes, Fix2(f, x) se comporte de manière similaire à y->f(y, x).
Syntax
Core.eval — FunctionCore.eval(m::Module, expr)Évalue une expression dans le module donné et renvoie le résultat.
eval — Functioneval(expr)Évalue une expression dans le scope global du module contenant. Chaque Module (sauf ceux définis avec baremodule) a sa propre définition à un argument de eval, qui évalue les expressions dans ce module.
Base.@eval — Macro@eval [mod,] exÉvaluez une expression avec des valeurs interpolées en utilisant eval. Si deux arguments sont fournis, le premier est le module dans lequel évaluer.
Base.evalfile — Functionevalfile(path::AbstractString, args::Vector{String}=String[])Charge le fichier dans un module anonyme en utilisant include, évalue toutes les expressions et retourne la valeur de la dernière expression. L'argument optionnel args peut être utilisé pour définir les arguments d'entrée du script (c'est-à-dire la variable globale ARGS). Notez que les définitions (par exemple, méthodes, globales) sont évaluées dans le module anonyme et n'affectent pas le module actuel.
Exemples
julia> write("testfile.jl", """
@show ARGS
1 + 1
""");
julia> x = evalfile("testfile.jl", ["ARG1", "ARG2"]);
ARGS = ["ARG1", "ARG2"]
julia> x
2
julia> rm("testfile.jl")Base.esc — Functionesc(e)Valide uniquement dans le contexte d'un Expr retourné par une macro. Empêche le passage d'hygiène de la macro de transformer les variables intégrées en variables gensym. Voir la section Macros du chapitre sur la Métaprogrammation du manuel pour plus de détails et d'exemples.
Base.@inbounds — Macro@inbounds(blk)Élimine la vérification des limites de tableau dans les expressions.
Dans l'exemple ci-dessous, la vérification de la plage pour référencer l'élément i du tableau A est ignorée pour améliorer les performances.
function sum(A::AbstractArray)
r = zero(eltype(A))
for i in eachindex(A)
@inbounds r += A[i]
end
return r
endL'utilisation de @inbounds peut renvoyer des résultats incorrects/faire planter/corrompre pour des indices hors limites. L'utilisateur est responsable de la vérification manuelle. N'utilisez @inbounds que lorsqu'il est certain, d'après les informations disponibles localement, que tous les accès sont dans les limites. En particulier, utiliser 1:length(A) au lieu de eachindex(A) dans une fonction comme celle ci-dessus n'est pas en toute sécurité dans les limites, car le premier indice de A peut ne pas être 1 pour tous les types définis par l'utilisateur qui sous-type AbstractArray.
Base.@boundscheck — Macro@boundscheck(blk)Annotates the expression blk as a bounds checking block, allowing it to be elided by @inbounds.
La fonction dans laquelle @boundscheck est écrite doit être intégrée dans son appelant pour que @inbounds ait un effet.
Exemples
julia> @inline function g(A, i)
@boundscheck checkbounds(A, i)
return "accès à ($A)[$i]"
end;
julia> f1() = return g(1:2, -1);
julia> f2() = @inbounds return g(1:2, -1);
julia> f1()
ERROR: BoundsError: tentative d'accès à un UnitRange{Int64} de 2 éléments à l'index [-1]
Stacktrace:
[1] throw_boundserror(::UnitRange{Int64}, ::Tuple{Int64}) at ./abstractarray.jl:455
[2] checkbounds at ./abstractarray.jl:420 [inlined]
[3] g at ./none:2 [inlined]
[4] f1() at ./none:1
[5] top-level scope
julia> f2()
"accès à (1:2)[-1]"L'annotation @boundscheck vous permet, en tant qu'auteur de bibliothèque, de choisir de permettre à d'autres codes de supprimer vos vérifications de limites avec @inbounds. Comme noté là-bas, l'appelant doit vérifier—en utilisant des informations auxquelles il peut accéder—que ses accès sont valides avant d'utiliser @inbounds. Par exemple, pour l'indexation dans vos sous-classes AbstractArray, cela implique de vérifier les indices par rapport à ses axes. Par conséquent, les annotations @boundscheck ne doivent être ajoutées à une implémentation de getindex ou setindex! qu'après vous être assuré que son comportement est correct.
Base.@propagate_inbounds — Macro@propagate_inboundsIndique au compilateur d'inliner une fonction tout en conservant le contexte inbounds de l'appelant.
Base.@inline — Macro@inlineDonnez un indice au compilateur que cette fonction vaut la peine d'être intégrée.
Les petites fonctions n'ont généralement pas besoin de l'annotation @inline, car le compilateur le fait automatiquement. En utilisant @inline sur des fonctions plus grandes, un coup de pouce supplémentaire peut être donné au compilateur pour l'intégrer.
@inline peut être appliqué immédiatement avant une définition de fonction ou dans un corps de fonction.
# annoter une définition longue
@inline function longdef(x)
...
end
# annoter une définition courte
@inline shortdef(x) = ...
# annoter une fonction anonyme qu'un bloc `do` crée
f() do
@inline
...
endL'utilisation dans un corps de fonction nécessite au moins Julia 1.8.
@inline blockDonnez un indice au compilateur que les appels dans block valent la peine d'être intégrés.
# Le compilateur essaiera d'intégrer `f`
@inline f(...)
# Le compilateur essaiera d'intégrer `f`, `g` et `+`
@inline f(...) + g(...)Une annotation de site d'appel a toujours la priorité sur l'annotation appliquée à la définition de la fonction appelée :
@noinline function explicit_noinline(args...)
# corps
end
let
@inline explicit_noinline(args...) # sera intégré
endLorsqu'il y a des annotations de site d'appel imbriquées, l'annotation la plus interne a la priorité :
@noinline let a0, b0 = ...
a = @inline f(a0) # le compilateur essaiera d'intégrer cet appel
b = f(b0) # le compilateur ne tentera PAS d'intégrer cet appel
return a, b
endBien qu'une annotation de site d'appel essaiera de forcer l'intégration indépendamment du modèle de coût, il y a encore des chances qu'elle ne réussisse pas. En particulier, les appels récursifs ne peuvent pas être intégrés même s'ils sont annotés comme @inlined.
L'annotation de site d'appel nécessite au moins Julia 1.8.
Base.@noinline — Macro@noinlineDonnez un indice au compilateur pour qu'il ne fasse pas d'inlining d'une fonction.
Les petites fonctions sont généralement inlinées automatiquement. En utilisant @noinline sur de petites fonctions, l'inlining automatique peut être empêché.
@noinline peut être appliqué immédiatement avant une définition de fonction ou dans le corps d'une fonction.
# annoter une définition longue
@noinline function longdef(x)
...
end
# annoter une définition courte
@noinline shortdef(x) = ...
# annoter une fonction anonyme créée par un bloc `do`
f() do
@noinline
...
endL'utilisation dans un corps de fonction nécessite au moins Julia 1.8.
@noinline blockDonnez un indice au compilateur pour qu'il ne fasse pas d'inlining des appels dans block.
# Le compilateur essaiera de ne pas inliner `f`
@noinline f(...)
# Le compilateur essaiera de ne pas inliner `f`, `g` et `+`
@noinline f(...) + g(...)Une annotation de site d'appel a toujours la priorité sur l'annotation appliquée à la définition de la fonction appelée :
@inline function explicit_inline(args...)
# corps
end
let
@noinline explicit_inline(args...) # ne sera pas inliné
endLorsque des annotations de site d'appel sont imbriquées, l'annotation la plus interne a la priorité :
@inline let a0, b0 = ...
a = @noinline f(a0) # le compilateur ne tentera PAS d'inliner cet appel
b = f(b0) # le compilateur tentera d'inliner cet appel
return a, b
endL'annotation de site d'appel nécessite au moins Julia 1.8.
Si la fonction est triviale (par exemple, retournant une constante), elle pourrait quand même être inlinée.
Base.@nospecialize — Macro@nospecializeAppliqué à un nom d'argument de fonction, cela indique au compilateur que l'implémentation de la méthode ne doit pas être spécialisée pour différents types de cet argument, mais plutôt utiliser le type déclaré pour cet argument. Il peut être appliqué à un argument dans une liste d'arguments formelle, ou dans le corps de la fonction. Lorsqu'il est appliqué à un argument, la macro doit envelopper l'ensemble de l'expression d'argument, par exemple, @nospecialize(x::Real) ou @nospecialize(i::Integer...) plutôt que d'envelopper seulement le nom de l'argument. Lorsqu'il est utilisé dans un corps de fonction, la macro doit se trouver en position de déclaration et avant tout code.
Lorsqu'il est utilisé sans arguments, il s'applique à tous les arguments de la portée parente. Dans une portée locale, cela signifie tous les arguments de la fonction contenant. Dans une portée globale (de niveau supérieur), cela signifie toutes les méthodes définies par la suite dans le module actuel.
La spécialisation peut être réinitialisée à la valeur par défaut en utilisant @specialize.
function example_function(@nospecialize x)
...
end
function example_function(x, @nospecialize(y = 1))
...
end
function example_function(x, y, z)
@nospecialize x y
...
end
@nospecialize
f(y) = [x for x in y]
@specialize@nospecialize affecte la génération de code mais pas l'inférence : il limite la diversité du code natif résultant, mais n'impose aucune limitation (au-delà des normes) sur l'inférence de type. Utilisez Base.@nospecializeinfer avec @nospecialize pour supprimer également l'inférence.
Exemples
julia> f(A::AbstractArray) = g(A)
f (generic function with 1 method)
julia> @noinline g(@nospecialize(A::AbstractArray)) = A[1]
g (generic function with 1 method)
julia> @code_typed f([1.0])
CodeInfo(
1 ─ %1 = invoke Main.g(_2::AbstractArray)::Float64
└── return %1
) => Float64Ici, l'annotation @nospecialize donne lieu à l'équivalent de
f(A::AbstractArray) = invoke(g, Tuple{AbstractArray}, A)garantissant qu'une seule version de code natif sera générée pour g, une qui est générique pour tout AbstractArray. Cependant, le type de retour spécifique est toujours inféré pour g et f, et cela est toujours utilisé pour optimiser les appelants de f et g.
Base.@specialize — Macro@specializeRéinitialise l'indice de spécialisation pour un argument à la valeur par défaut. Pour plus de détails, voir @nospecialize.
Base.@nospecializeinfer — MacroBase.@nospecializeinfer function f(args...)
@nospecialize ...
...
end
Base.@nospecializeinfer f(@nospecialize args...) = ...Indique au compilateur d'inférer f en utilisant les types déclarés des arguments @nospecialize. Cela peut être utilisé pour limiter le nombre de spécialisations générées par le compilateur pendant l'inférence.
Exemples
julia> f(A::AbstractArray) = g(A)
f (generic function with 1 method)
julia> @noinline Base.@nospecializeinfer g(@nospecialize(A::AbstractArray)) = A[1]
g (generic function with 1 method)
julia> @code_typed f([1.0])
CodeInfo(
1 ─ %1 = invoke Main.g(_2::AbstractArray)::Any
└── return %1
) => AnyDans cet exemple, f sera inféré pour chaque type spécifique de A, mais g ne sera inféré qu'une seule fois avec le type d'argument déclaré A::AbstractArray, ce qui signifie que le compilateur ne verra probablement pas le temps d'inférence excessif sur celui-ci tout en ne pouvant pas inférer le type de retour concret. Sans le @nospecializeinfer, f([1.0]) inférerait le type de retour de g comme Float64, indiquant que l'inférence a été effectuée pour g(::Vector{Float64}) malgré l'interdiction de génération de code spécialisé.
L'utilisation de Base.@nospecializeinfer nécessite la version 1.10 de Julia.
Base.@constprop — MacroBase.@constprop réglage [ex]Contrôlez le mode de propagation constante interprocédurale pour la fonction annotée.
Deux réglages sont pris en charge :
Base.@constprop :aggressive [ex]: appliquez la propagation constante de manière agressive. Pour une méthode dont le type de retour dépend de la valeur des arguments, cela peut donner de meilleurs résultats d'inférence au prix d'un temps de compilation supplémentaire.Base.@constprop :none [ex]: désactivez la propagation constante. Cela peut réduire les temps de compilation pour les fonctions que Julia pourrait autrement juger dignes de propagation constante. Les cas courants concernent les fonctions avec des arguments de typeBoolouSymbolou des arguments de mot-clé.
Base.@constprop peut être appliqué immédiatement avant une définition de fonction ou dans le corps d'une fonction.
# annoter une définition longue
Base.@constprop :aggressive function longdef(x)
...
end
# annoter une définition courte
Base.@constprop :aggressive shortdef(x) = ...
# annoter une fonction anonyme qu'un bloc `do` crée
f() do
Base.@constprop :aggressive
...
endL'utilisation dans le corps d'une fonction nécessite au moins Julia 1.10.
Base.gensym — Functiongensym([tag])Génère un symbole qui ne conflictera pas avec d'autres noms de variables (dans le même module).
Base.@gensym — Macro@gensymGénère un symbole gensym pour une variable. Par exemple, @gensym x y est transformé en x = gensym("x"); y = gensym("y").
var"name" — KeywordvarLa syntaxe var"#example#" fait référence à une variable nommée Symbol("#example#"), même si #example# n'est pas un nom d'identifiant valide en Julia.
Cela peut être utile pour l'interopérabilité avec des langages de programmation qui ont des règles différentes pour la construction d'identifiants valides. Par exemple, pour faire référence à la variable R draw.segments, vous pouvez utiliser var"draw.segments" dans votre code Julia.
Il est également utilisé pour show le code source julia qui a été soumis à l'hygiène des macros ou qui contient autrement des noms de variables qui ne peuvent pas être analysés normalement.
Notez que cette syntaxe nécessite un support du parseur, elle est donc étendue directement par le parseur plutôt que d'être implémentée comme une macro de chaîne normale @var_str.
Cette syntaxe nécessite au moins Julia 1.3.
Base.@goto — Macro@goto nom@goto nom effectue un saut inconditionnel vers l'instruction à l'emplacement @label nom.
@label et @goto ne peuvent pas créer de sauts vers des instructions de niveau supérieur différentes. Les tentatives entraînent une erreur. Pour utiliser quand même @goto, enfermez @label et @goto dans un bloc.
Base.@label — Macro@label nomÉtiquette une déclaration avec l'étiquette symbolique nom. L'étiquette marque le point de fin d'un saut inconditionnel avec @goto nom.
Base.SimdLoop.@simd — Macro@simdAnnoter une boucle for pour permettre au compilateur de prendre des libertés supplémentaires pour permettre le réarrangement des boucles
Cette fonctionnalité est expérimentale et pourrait changer ou disparaître dans de futures versions de Julia. Une utilisation incorrecte de la macro @simd peut entraîner des résultats inattendus.
L'objet itéré dans une boucle @simd for doit être une plage unidimensionnelle. En utilisant @simd, vous affirmez plusieurs propriétés de la boucle :
- Il est sûr d'exécuter les itérations dans un ordre arbitraire ou qui se chevauche, avec une attention particulière pour les variables de réduction.
- Les opérations en virgule flottante sur les variables de réduction peuvent être réorganisées ou contractées, ce qui peut entraîner des résultats différents de ceux sans
@simd.
Dans de nombreux cas, Julia est capable de vectoriser automatiquement les boucles internes sans l'utilisation de @simd. L'utilisation de @simd donne au compilateur un peu plus de marge de manœuvre pour le rendre possible dans plus de situations. Dans tous les cas, votre boucle interne doit avoir les propriétés suivantes pour permettre la vectorisation :
- La boucle doit être une boucle la plus interne
- Le corps de la boucle doit être du code en ligne droite. Par conséquent,
@inboundsest actuellement nécessaire pour tous les accès aux tableaux. Le compilateur peut parfois transformer de courtes expressions&&,||et?:en code en ligne droite s'il est sûr d'évaluer tous les opérandes de manière inconditionnelle. Envisagez d'utiliser la fonctionifelseau lieu de?:dans la boucle si cela est sûr à faire. - Les accès doivent avoir un motif de pas et ne peuvent pas être des "gather" (lectures à index aléatoire) ou des "scatter" (écritures à index aléatoire).
- Le pas doit être un pas unitaire.
Le @simd n'affirme pas par défaut que la boucle est complètement exempte de dépendances de mémoire portées par la boucle, ce qui est une hypothèse qui peut facilement être violée dans du code générique. Si vous écrivez du code non générique, vous pouvez utiliser @simd ivdep for ... end pour affirmer également que :
- Il n'existe aucune dépendance de mémoire portée par la boucle
- Aucune itération n'attend jamais qu'une itération précédente progresse.
Base.@polly — Macro@pollyIndique au compilateur d'appliquer l'optimiseur polyédrique Polly à une fonction.
Base.@generated — Macro@generated f@generated est utilisé pour annoter une fonction qui sera générée. Dans le corps de la fonction générée, seuls les types des arguments peuvent être lus (pas les valeurs). La fonction renvoie une expression citée évaluée lorsque la fonction est appelée. Le macro @generated ne doit pas être utilisé sur des fonctions modifiant l'espace global ou dépendant d'éléments mutables.
Voir Metaprogramming pour plus de détails.
Exemples
julia> @generated function bar(x)
if x <: Integer
return :(x ^ 2)
else
return :(x)
end
end
bar (generic function with 1 method)
julia> bar(4)
16
julia> bar("baz")
"baz"Base.@assume_effects — MacroBase.@assume_effects réglage... [ex]Surchargez la modélisation des effets du compilateur. Cette macro peut être utilisée dans plusieurs contextes :
- Immédiatement avant une définition de méthode, pour remplacer la modélisation des effets de la méthode appliquée.
- Dans le corps d'une fonction sans arguments, pour remplacer la modélisation des effets de la méthode englobante.
- Appliquée à un bloc de code, pour remplacer la modélisation locale des effets du bloc de code appliqué.
Exemples
julia> Base.@assume_effects :terminates_locally function fact(x)
# utilisation 1 :
# ce :terminates_locally permet à `fact` d'être constant plié
res = 1
0 ≤ x < 20 || error("mauvais fact")
while x > 1
res *= x
x -= 1
end
return res
end
fact (generic function with 1 method)
julia> code_typed() do
fact(12)
end |> only
CodeInfo(
1 ─ return 479001600
) => Int64
julia> code_typed() do
map((2,3,4)) do x
# utilisation 2 :
# ce :terminates_locally permet à cette fonction anonyme d'être constant pliée
Base.@assume_effects :terminates_locally
res = 1
0 ≤ x < 20 || error("mauvais fact")
while x > 1
res *= x
x -= 1
end
return res
end
end |> only
CodeInfo(
1 ─ return (2, 6, 24)
) => Tuple{Int64, Int64, Int64}
julia> code_typed() do
map((2,3,4)) do x
res = 1
0 ≤ x < 20 || error("mauvais fact")
# utilisation 3 :
# avec cette annotation :terminates_locally, le compilateur évite de marquer
# l'effet `:terminates` dans ce bloc `while`, permettant à la fonction
# anonyme parente d'être constant pliée
Base.@assume_effects :terminates_locally while x > 1
res *= x
x -= 1
end
return res
end
end |> only
CodeInfo(
1 ─ return (2, 6, 24)
) => Tuple{Int64, Int64, Int64}L'utilisation de Base.@assume_effects nécessite la version Julia 1.8.
L'utilisation dans le corps d'une fonction nécessite au moins Julia 1.10.
L'annotation de bloc de code nécessite au moins Julia 1.11.
Une utilisation incorrecte de cette macro entraîne un comportement indéfini (y compris des plantages, des réponses incorrectes ou d'autres bogues difficiles à suivre). Utilisez avec précaution et uniquement en dernier recours si absolument nécessaire. Même dans ce cas, vous DEVEZ prendre toutes les mesures possibles pour minimiser la force de l'assertion d'effet (par exemple, ne pas utiliser :total si :nothrow aurait été suffisant).
En général, chaque valeur de réglage fait une assertion sur le comportement de la fonction, sans exiger que le compilateur prouve que ce comportement est effectivement vrai. Ces assertions sont faites pour tous les âges du monde. Il est donc conseillé de limiter l'utilisation de fonctions génériques qui pourraient être étendues ultérieurement pour invalider l'hypothèse (ce qui entraînerait un comportement indéfini).
Les réglages suivants sont pris en charge.
:consistent:effect_free:nothrow:terminates_globally:terminates_locally:notaskstate:inaccessiblememonly:noub:noub_if_noinbounds:nortcall:foldable:removable:total
Aide étendue
:consistent
Le réglage :consistent affirme que pour des entrées égales (===) :
- La manière de terminaison (valeur de retour, exception, non-termination) sera toujours la même.
- Si la méthode retourne, les résultats seront toujours égaux.
Cela implique en particulier que la méthode ne doit pas retourner un objet mutable nouvellement alloué. Plusieurs allocations d'objets mutables (même avec un contenu identique) ne sont pas égales.
L'assertion :consistent est faite par âge du monde. Plus formellement, écrivez $fᵢ$ pour l'évaluation de $f$ dans l'âge du monde $i$, alors ce réglage exige :
\[∀ i, x, y: x ≡ y → fᵢ(x) ≡ fᵢ(y)\]
Cependant, pour deux âges du monde $i$, $j$ tels que $i ≠ j$, nous pouvons avoir $fᵢ(x) ≢ fⱼ(y)$.
Une autre implication est que les fonctions :consistent ne peuvent pas rendre leur valeur de retour dépendante de l'état du tas ou de tout autre état global qui n'est pas constant pour un âge du monde donné.
Les fonctions :consistent incluent toutes les réécritures légales effectuées par l'optimiseur. Par exemple, les opérations fastmath en virgule flottante ne sont pas considérées comme :consistent, car l'optimiseur peut les réécrire, ce qui entraîne une sortie qui n'est pas :consistent, même pour le même âge du monde (par exemple, parce qu'une a été exécutée dans l'interpréteur, tandis que l'autre a été optimisée).
Si les fonctions :consistent se terminent en lançant une exception, cette exception elle-même n'est pas requise pour répondre à l'exigence d'égalité spécifiée ci-dessus.
:effect_free
Le réglage :effect_free affirme que la méthode est exempte d'effets secondaires sémantiquement visibles externes. La liste suivante est une liste incomplète d'effets secondaires sémantiquement visibles externes :
- Changer la valeur d'une variable globale.
- Muter le tas (par exemple, un tableau ou une valeur mutable), sauf comme noté ci-dessous.
- Changer la table des méthodes (par exemple, par des appels à eval).
- I/O de fichiers/réseau/etc.
- Changement de tâche.
Cependant, les éléments suivants ne sont explicitement pas visibles sémantiquement, même s'ils peuvent être observables :
- Allocations de mémoire (à la fois mutables et immuables).
- Temps écoulé.
- Collecte des ordures.
- Mutations du tas d'objets dont la durée de vie ne dépasse pas la méthode (c'est-à-dire qui ont été alloués dans la méthode et ne s'échappent pas).
- La valeur retournée (qui est visible de l'extérieur, mais pas un effet secondaire).
La règle générale ici est qu'un effet secondaire visible de l'extérieur est tout ce qui affecterait l'exécution du reste du programme si la fonction n'était pas exécutée.
L'assertion :effect_free est faite à la fois pour la méthode elle-même et tout code exécuté par la méthode. Gardez à l'esprit que l'assertion doit être valide pour tous les âges du monde et limitez l'utilisation de cette assertion en conséquence.
:nothrow
Le réglage :nothrow affirme que cette méthode ne lance pas d'exception (c'est-à-dire qu'elle retournera toujours une valeur ou ne retournera jamais).
Il est permis aux méthodes annotées :nothrow d'utiliser la gestion des exceptions en interne tant que l'exception n'est pas relancée en dehors de la méthode elle-même.
Si l'exécution d'une méthode peut lever des MethodError et des exceptions similaires, alors la méthode n'est pas considérée comme :nothrow. Cependant, notez que les erreurs dépendantes de l'environnement comme StackOverflowError ou InterruptException ne sont pas modélisées par cet effet et donc une méthode qui peut entraîner un StackOverflowError n'a pas nécessairement besoin d'être !:nothrow (bien qu'elle devrait généralement être !:terminates aussi).
:terminates_globally
Le réglage :terminates_globally affirme que cette méthode se terminera éventuellement (soit normalement, soit anormalement), c'est-à-dire qu'elle ne boucle pas indéfiniment.
Cette assertion :terminates_globally couvre toutes les autres méthodes appelées par la méthode annotée.
Le compilateur considérera cela comme une forte indication que la méthode se terminera relativement rapidement et peut (si autrement légal) appeler cette méthode à la compilation. C'est-à-dire qu'il est une mauvaise idée d'annoter ce réglage sur une méthode qui techniquement, mais pas pratiquement, se termine.
:terminates_locally
Le réglage :terminates_locally est comme :terminates_globally, sauf qu'il ne s'applique qu'au flux de contrôle syntaxique dans la méthode annotée. C'est donc une assertion beaucoup plus faible (et donc plus sûre) qui permet la possibilité de non-termination si la méthode appelle une autre méthode qui ne se termine pas.
:terminates_globally implique :terminates_locally.
:notaskstate
Le réglage :notaskstate affirme que la méthode n'utilise ni ne modifie l'état de tâche local (stockage local de tâche, état RNG, etc.) et peut donc être déplacée en toute sécurité entre les tâches sans résultats observables.
L'implémentation de la gestion des exceptions utilise un état stocké dans l'objet tâche. Cependant, cet état n'est actuellement pas considéré comme étant dans le champ d'application de :notaskstate et est suivi séparément à l'aide de l'effet :nothrow.
L'assertion :notaskstate concerne l'état de la tâche actuellement en cours d'exécution. Si une référence à un objet Task est obtenue par d'autres moyens qui ne tiennent pas compte de la tâche qui est actuellement en cours d'exécution, l'effet :notaskstate n'a pas besoin d'être marqué. Cela est vrai, même si cet objet tâche se trouve être === à la tâche actuellement en cours d'exécution.
L'accès à l'état de la tâche entraîne généralement également le marquage d'autres effets, tels que :effect_free (si l'état de la tâche est modifié) ou :consistent (si l'état de la tâche est utilisé dans le calcul du résultat). En particulier, le code qui n'est pas :notaskstate, mais qui est :effect_free et :consistent peut toujours être éliminé comme code mort et donc promu à :total.
:inaccessiblememonly
Le réglage :inaccessiblememonly affirme que la méthode n'accède ni ne modifie la mémoire mutable accessible de l'extérieur. Cela signifie que la méthode peut accéder ou modifier la mémoire mutable pour des objets nouvellement alloués qui ne sont pas accessibles par d'autres méthodes ou exécutions de niveau supérieur avant le retour de la méthode, mais elle ne peut pas accéder ou modifier un état global mutable ou une mémoire mutable pointée par ses arguments.
Ci-dessous se trouve une liste incomplète d'exemples qui invalident cette hypothèse :
- une référence globale ou un appel
getglobalpour accéder à une variable globale mutable - une affectation globale ou un appel
setglobal!pour effectuer une affectation à une variable globale non constante - un appel
setfield!qui change un champ d'une variable mutable globale
Cette assertion :inaccessiblememonly couvre toutes les autres méthodes appelées par la méthode annotée.
:noub
Le réglage :noub affirme que la méthode n'exécutera aucun comportement indéfini (pour toute entrée). Notez que le comportement indéfini peut techniquement amener la méthode à violer d'autres assertions d'effet (telles que :consistent ou :effect_free), mais nous ne modélisons pas cela, et elles supposent l'absence de comportement indéfini.
:nortcall
Le réglage :nortcall affirme que la méthode n'appelle pas Core.Compiler.return_type, et que toutes les autres méthodes que cette méthode pourrait appeler n'appellent également pas Core.Compiler.return_type.
Pour être précis, cette assertion peut être utilisée lorsqu'un appel à Core.Compiler.return_type n'est pas effectué à l'exécution ; c'est-à-dire lorsque le résultat de Core.Compiler.return_type est connu exactement à la compilation et que l'appel est éliminé par l'optimiseur. Cependant, étant donné que la question de savoir si le résultat de Core.Compiler.return_type est plié à la compilation dépend fortement de l'implémentation du compilateur, il est généralement risqué d'affirmer cela si la méthode en question utilise Core.Compiler.return_type sous une forme quelconque.
:foldable
Ce réglage est un raccourci pratique pour l'ensemble des effets que le compilateur exige pour garantir le pliage constant d'un appel à la compilation. Il est actuellement équivalent aux réglages suivants :
:consistent:effect_free:terminates_globally:noub:nortcall
Cette liste, en particulier, n'inclut pas :nothrow. Le compilateur tentera toujours la propagation constante et notera toute erreur lancée à la compilation. Notez cependant qu'en raison des exigences de :consistent, tout appel annoté de cette manière doit lancer de manière cohérente pour les mêmes valeurs d'argument.
Une annotation explicite @inbounds à l'intérieur de la fonction désactivera également le pliage constant et ne sera pas remplacée par :foldable.
:removable
Ce réglage est un raccourci pratique pour l'ensemble des effets que le compilateur exige pour garantir la suppression d'un appel dont le résultat est inutilisé à la compilation. Il est actuellement équivalent aux réglages suivants :
:effect_free:nothrow:terminates_globally
:total
Ce réglage est le maximum possible d'effets. Il implique actuellement les autres réglages suivants :
:consistent:effect_free:nothrow:terminates_globally:notaskstate:inaccessiblememonly:noub:nortcall
:total est une assertion très forte et gagnera probablement des sémantiques supplémentaires dans les futures versions de Julia (par exemple, si des effets supplémentaires sont ajoutés et inclus dans la définition de :total). En conséquence, il doit être utilisé avec précaution. Chaque fois que cela est possible, il est préférable d'utiliser l'ensemble minimum possible d'assertions d'effet spécifiques requises pour une application particulière. Dans les cas où un grand nombre de remplacements d'effet s'appliquent à un ensemble de fonctions, une macro personnalisée est recommandée plutôt que l'utilisation de :total.
Effets niés
Les noms d'effet peuvent être préfixés par ! pour indiquer que l'effet doit être supprimé d'un effet méta précédent. Par exemple, :total !:nothrow indique que bien que l'appel soit généralement total, il peut cependant lancer.
Managing deprecations
Base.@deprecate — Macro@deprecate old new [export_old=true]Déprécier la méthode old et spécifier l'appel de remplacement new, en définissant une nouvelle méthode old avec la signature spécifiée dans le processus.
Pour empêcher old d'être exporté, définissez export_old sur false.
Voir aussi Base.depwarn().
À partir de Julia 1.5, les fonctions définies par @deprecate ne génèrent pas d'avertissement lorsque julia est exécuté sans le drapeau --depwarn=yes activé, car la valeur par défaut de l'option --depwarn est no. Les avertissements sont imprimés lors des tests exécutés par Pkg.test().
Exemples
julia> @deprecate old(x) new(x)
old (generic function with 1 method)
julia> @deprecate old(x) new(x) false
old (generic function with 1 method)Les appels à @deprecate sans annotations de type explicites définiront des méthodes dépréciées acceptant n'importe quel nombre d'arguments positionnels et d'arguments de mot-clé de type Any.
Les arguments de mot-clé sont transmis lorsqu'il n'y a pas d'annotation de type explicite à partir de Julia 1.9. Pour les versions antérieures, vous pouvez transmettre manuellement les arguments positionnels et de mot-clé en faisant @deprecate old(args...; kwargs...) new(args...; kwargs...).
Pour restreindre la dépréciation à une signature spécifique, annotez les arguments de old. Par exemple,
julia> new(x::Int) = x;
julia> new(x::Float64) = 2x;
julia> @deprecate old(x::Int) new(x);
julia> methods(old)
# 1 method for generic function "old" from Main:
[1] old(x::Int64)
@ deprecated.jl:94définira et dépréciera une méthode old(x::Int) qui reflète new(x::Int) mais ne définira ni ne dépréciera la méthode old(x::Float64).
Base.depwarn — FunctionBase.depwarn(msg::String, funcsym::Symbol; force=false)Imprime msg comme un avertissement de dépréciation. Le symbole funcsym doit être le nom de la fonction appelante, qui est utilisé pour s'assurer que l'avertissement de dépréciation n'est imprimé qu'une seule fois pour chaque lieu d'appel. Définissez force=true pour forcer l'avertissement à toujours être affiché, même si Julia a été démarré avec --depwarn=no (par défaut).
Voir aussi @deprecate.
Exemples
function deprecated_func()
Base.depwarn("N'utilisez pas `deprecated_func()` !", :deprecated_func)
1 + 1
endMissing Values
Base.Missing — TypeMissingUn type sans champs dont l'instance unique missing est utilisée pour représenter des valeurs manquantes.
Voir aussi : skipmissing, nonmissingtype, Nothing.
Base.missing — ConstantmissingL'instance singleton de type Missing représentant une valeur manquante.
Voir aussi : NaN, skipmissing, nonmissingtype.
Base.coalesce — Functioncoalesce(x...)Renvoie la première valeur dans les arguments qui n'est pas égale à missing, le cas échéant. Sinon, renvoie missing.
Voir aussi skipmissing, something, @coalesce.
Exemples
julia> coalesce(missing, 1)
1
julia> coalesce(1, missing)
1
julia> coalesce(nothing, 1) # renvoie `nothing`
julia> coalesce(missing, missing)
missingBase.@coalesce — Macro@coalesce(x...)Version à court-circuit de coalesce.
Exemples
julia> f(x) = (println("f($x)"); missing);
julia> a = 1;
julia> a = @coalesce a f(2) f(3) error("`a` est toujours manquant")
1
julia> b = missing;
julia> b = @coalesce b f(2) f(3) error("`b` est toujours manquant")
f(2)
f(3)
ERROR: `b` est toujours manquant
[...]Ce macro est disponible depuis Julia 1.7.
Base.ismissing — FunctionBase.skipmissing — Functionskipmissing(itr)Renvoie un itérateur sur les éléments de itr en sautant les valeurs missing. L'objet retourné peut être indexé en utilisant les indices de itr si ce dernier est indexable. Les indices correspondant aux valeurs manquantes ne sont pas valides : ils sont ignorés par keys et eachindex, et une MissingException est levée lorsque vous essayez de les utiliser.
Utilisez collect pour obtenir un Array contenant les valeurs non-missing dans itr. Notez que même si itr est un tableau multidimensionnel, le résultat sera toujours un Vector car il n'est pas possible de supprimer les valeurs manquantes tout en préservant les dimensions de l'entrée.
Voir aussi coalesce, ismissing, something.
Exemples
julia> x = skipmissing([1, missing, 2])
skipmissing(Union{Missing, Int64}[1, missing, 2])
julia> sum(x)
3
julia> x[1]
1
julia> x[2]
ERROR: MissingException: la valeur à l'index (2,) est manquante
[...]
julia> argmax(x)
3
julia> collect(keys(x))
Vector{Int64} de 2 éléments:
1
3
julia> collect(skipmissing([1, missing, 2]))
Vector{Int64} de 2 éléments:
1
2
julia> collect(skipmissing([1 missing; 2 missing]))
Vector{Int64} de 2 éléments:
1
2Base.nonmissingtype — Functionnonmissingtype(T::Type)Si T est une union de types contenant Missing, renvoie un nouveau type avec Missing supprimé.
Exemples
julia> nonmissingtype(Union{Int64,Missing})
Int64
julia> nonmissingtype(Any)
AnyCette fonction est exportée depuis Julia 1.3.
System
Base.run — Functionrun(command, args...; wait::Bool = true)Exécute un objet de commande, construit avec des backticks (voir la section Exécution de programmes externes dans le manuel). Lève une erreur si quelque chose ne va pas, y compris si le processus se termine avec un statut non nul (lorsque wait est vrai).
Les args... vous permettent de passer des descripteurs de fichiers à la commande, et sont ordonnés comme des descripteurs de fichiers unix réguliers (par exemple stdin, stdout, stderr, FD(3), FD(4)...).
Si wait est faux, le processus s'exécute de manière asynchrone. Vous pouvez ensuite attendre qu'il se termine et vérifier son statut de sortie en appelant success sur l'objet de processus retourné.
Lorsque wait est faux, les flux d'E/S du processus sont dirigés vers devnull. Lorsque wait est vrai, les flux d'E/S sont partagés avec le processus parent. Utilisez pipeline pour contrôler la redirection des E/S.
Base.devnull — ConstantdevnullUtilisé dans une redirection de flux pour supprimer toutes les données qui y sont écrites. Essentiellement équivalent à /dev/null sur Unix ou NUL sur Windows. Utilisation :
run(pipeline(`cat test.txt`, devnull))Base.success — Functionsuccess(command)Exécute un objet de commande, construit avec des backticks (voir la section Exécution de programmes externes dans le manuel), et indique s'il a réussi (s'est terminé avec un code de 0). Une exception est levée si le processus ne peut pas être démarré.
Base.process_running — Functionprocess_running(p::Process)Déterminez si un processus est actuellement en cours d'exécution.
Base.process_exited — Functionprocess_exited(p::Process)Déterminez si un processus a quitté.
Base.kill — Methodkill(p::Process, signum=Base.SIGTERM)Envoyer un signal à un processus. La valeur par défaut est de terminer le processus. Renvoie avec succès si le processus a déjà quitté, mais lance une erreur si la terminaison du processus a échoué pour d'autres raisons (par exemple, permissions insuffisantes).
Base.Sys.set_process_title — FunctionSys.set_process_title(title::AbstractString)Définir le titre du processus. N'a aucun effet sur certains systèmes d'exploitation.
Base.Sys.get_process_title — FunctionSys.get_process_title()Obtenez le titre du processus. Sur certains systèmes, cela renverra toujours une chaîne vide.
Base.ignorestatus — Functionignorestatus(command)Marquer un objet de commande afin que son exécution ne génère pas d'erreur si le code de résultat est non nul.
Base.detach — Functiondetach(command)Marque un objet de commande pour qu'il soit exécuté dans un nouveau groupe de processus, lui permettant de survivre au processus julia, et de ne pas recevoir les interruptions Ctrl-C.
Base.Cmd — TypeCmd(cmd::Cmd; ignorestatus, detach, windows_verbatim, windows_hide, env, dir)
Cmd(exec::Vector{String})Construit un nouvel objet Cmd, représentant un programme externe et des arguments, à partir de cmd, tout en modifiant les paramètres des arguments optionnels :
ignorestatus::Bool: Sitrue(par défautfalse), alors leCmdne lancera pas d'erreur si le code de retour est non nul.detach::Bool: Sitrue(par défautfalse), alors leCmdsera exécuté dans un nouveau groupe de processus, lui permettant de survivre au processusjuliaet de ne pas recevoir Ctrl-C.windows_verbatim::Bool: Sitrue(par défautfalse), alors sous Windows, leCmdenverra une chaîne de commande au processus sans citation ni échappement des arguments, même pour les arguments contenant des espaces. (Sous Windows, les arguments sont envoyés à un programme sous forme d'une seule chaîne "de ligne de commande", et les programmes sont responsables de son analyse en arguments. Par défaut, les arguments vides et les arguments contenant des espaces ou des tabulations sont cités avec des guillemets doubles"dans la ligne de commande, et\ou"sont précédés de barres obliques inverses.windows_verbatim=trueest utile pour lancer des programmes qui analysent leur ligne de commande de manière non standard.) N'a aucun effet sur les systèmes non-Windows.windows_hide::Bool: Sitrue(par défautfalse), alors sous Windows, aucune nouvelle fenêtre de console n'est affichée lorsque leCmdest exécuté. Cela n'a aucun effet si une console est déjà ouverte ou sur des systèmes non-Windows.env: Définit les variables d'environnement à utiliser lors de l'exécution duCmd.envest soit un dictionnaire mappant des chaînes à des chaînes, un tableau de chaînes sous la forme"var=val", un tableau ou un tuple de paires"var"=>val. Pour modifier (plutôt que remplacer) l'environnement existant, initialisezenvaveccopy(ENV)puis définissezenv["var"]=valselon vos besoins. Pour ajouter à un bloc d'environnement dans un objetCmdsans remplacer tous les éléments, utilisezaddenv()qui renverra un objetCmdavec l'environnement mis à jour.dir::AbstractString: Spécifiez un répertoire de travail pour la commande (au lieu du répertoire actuel).
Pour tous les mots-clés qui ne sont pas spécifiés, les paramètres actuels de cmd sont utilisés.
Notez que le constructeur Cmd(exec) ne crée pas une copie de exec. Tout changement ultérieur de exec sera reflété dans l'objet Cmd.
La manière la plus courante de construire un objet Cmd est avec des littéraux de commande (backticks), par exemple :
`ls -l`Cela peut ensuite être passé au constructeur Cmd pour modifier ses paramètres, par exemple :
Cmd(`echo "Hello world"`, ignorestatus=true, detach=false)Base.setenv — Functionsetenv(command::Cmd, env; dir)Définir des variables d'environnement à utiliser lors de l'exécution de la commande donnée. env est soit un dictionnaire mappant des chaînes à des chaînes, un tableau de chaînes de la forme "var=val", ou zéro ou plusieurs arguments de paire "var"=>val. Pour modifier (plutôt que de remplacer) l'environnement existant, créez env via copy(ENV) puis définissez env["var"]=val comme désiré, ou utilisez addenv.
L'argument clé dir peut être utilisé pour spécifier un répertoire de travail pour la commande. dir par défaut est le dir actuellement défini pour command (qui est le répertoire de travail actuel s'il n'est pas déjà spécifié).
Base.addenv — Functionaddenv(command::Cmd, env...; inherit::Bool = true)Fusionne de nouvelles mappages d'environnement dans l'objet Cmd donné, retournant un nouvel objet Cmd. Les clés en double sont remplacées. Si command ne contient pas déjà de valeurs d'environnement, il hérite de l'environnement actuel au moment de l'appel de addenv() si inherit est true. Les clés avec la valeur nothing sont supprimées de l'environnement.
Cette fonction nécessite Julia 1.6 ou une version ultérieure.
Base.withenv — Functionwithenv(f, kv::Pair...)Exécutez f dans un environnement qui est temporairement modifié (et non remplacé comme dans setenv) par zéro ou plusieurs arguments "var"=>val kv. withenv est généralement utilisé via la syntaxe withenv(kv...) do ... end. Une valeur de nothing peut être utilisée pour désactiver temporairement une variable d'environnement (si elle est définie). Lorsque withenv retourne, l'environnement d'origine a été restauré.
Changer l'environnement n'est pas thread-safe. Pour exécuter des commandes externes avec un environnement différent de celui du processus parent, il est préférable d'utiliser addenv plutôt que withenv.
Base.setcpuaffinity — Functionsetcpuaffinity(original_command::Cmd, cpus) -> command::CmdDéfinissez l'affinité CPU de la command par une liste d'ID de CPU (basée sur 1) cpus. Passer cpus = nothing signifie désactiver l'affinité CPU si la original_command en a une.
Cette fonction est prise en charge uniquement sous Linux et Windows. Elle n'est pas prise en charge sous macOS car libuv ne prend pas en charge la définition de l'affinité.
Cette fonction nécessite au moins Julia 1.8.
Exemples
Sous Linux, le programme en ligne de commande taskset peut être utilisé pour voir comment setcpuaffinity fonctionne.
julia> run(setcpuaffinity(`sh -c 'taskset -p $$'`, [1, 2, 5]));
pid 2273's current affinity mask: 13Notez que la valeur du masque 13 reflète que les premier, deuxième et cinquième bits (en comptant à partir de la position la moins significative) sont activés :
julia> 0b010011
0x13Base.pipeline — Methodpipeline(from, to, ...)Créez un pipeline d'une source de données à une destination. La source et la destination peuvent être des commandes, des flux d'E/S, des chaînes de caractères ou des résultats d'autres appels à pipeline. Au moins un argument doit être une commande. Les chaînes de caractères font référence à des noms de fichiers. Lorsqu'il est appelé avec plus de deux arguments, ils sont enchaînés de gauche à droite. Par exemple, pipeline(a,b,c) est équivalent à pipeline(pipeline(a,b),c). Cela fournit un moyen plus concis de spécifier des pipelines à plusieurs étapes.
Exemples:
run(pipeline(`ls`, `grep xyz`))
run(pipeline(`ls`, "out.txt"))
run(pipeline("out.txt", `grep xyz`))Base.pipeline — Methodpipeline(command; stdin, stdout, stderr, append=false)Redirige l'entrée/sortie vers ou depuis la commande donnée command. Les arguments clés spécifient quels flux de la commande doivent être redirigés. append contrôle si la sortie de fichier s'ajoute au fichier. C'est une version plus générale de la fonction pipeline à 2 arguments. pipeline(from, to) est équivalent à pipeline(from, stdout=to) lorsque from est une commande, et à pipeline(to, stdin=from) lorsque from est un autre type de source de données.
Exemples:
run(pipeline(`dothings`, stdout="out.txt", stderr="errs.txt"))
run(pipeline(`update`, stdout="log.txt", append=true))Base.Libc.gethostname — Functiongethostname() -> StringObtenez le nom d'hôte de la machine locale.
Base.Libc.getpid — Functiongetpid() -> Int32Obtenez l'ID de processus de Julia.
getpid(process) -> Int32Obtenez l'ID du processus enfant, s'il existe encore.
Cette fonction nécessite au moins Julia 1.1.
Base.Libc.time — Methodtime() -> Float64Obtenez l'heure système en secondes depuis l'époque, avec une résolution assez élevée (typiquement, en microsecondes).
Base.time_ns — Functiontime_ns() -> UInt64Obtenez le temps en nanosecondes. Le temps correspondant à 0 est indéfini et se répète tous les 5,8 ans.
Base.@time — Macro@time expr
@time "description" exprUne macro pour exécuter une expression, affichant le temps qu'il a fallu pour s'exécuter, le nombre d'allocations et le nombre total d'octets que son exécution a causé d'être alloués, avant de retourner la valeur de l'expression. Tout le temps passé à collecter les déchets (gc), à compiler du nouveau code ou à recompiler du code invalidé est affiché en pourcentage. Tout conflit de verrouillage où un ReentrantLock a dû attendre est affiché sous forme de compte.
Fournissez éventuellement une chaîne de description à imprimer avant le rapport de temps.
Dans certains cas, le système regardera à l'intérieur de l'expression @time et compilera une partie du code appelé avant que l'exécution de l'expression de niveau supérieur ne commence. Lorsque cela se produit, une partie du temps de compilation ne sera pas comptée. Pour inclure ce temps, vous pouvez exécuter @time @eval ....
Voir aussi @showtime, @timev, @timed, @elapsed, @allocated, et @allocations.
Pour des benchmarks plus sérieux, envisagez la macro @btime du package BenchmarkTools.jl qui, entre autres, évalue la fonction plusieurs fois afin de réduire le bruit.
L'option d'ajouter une description a été introduite dans Julia 1.8.
Le temps de recompilation étant affiché séparément du temps de compilation a été introduit dans Julia 1.8
Le rapport de tout conflit de verrouillage a été ajouté dans Julia 1.11.
julia> x = rand(10,10);
julia> @time x * x;
0.606588 seconds (2.19 M allocations: 116.555 MiB, 3.75% gc time, 99.94% compilation time)
julia> @time x * x;
0.000009 seconds (1 allocation: 896 bytes)
julia> @time begin
sleep(0.3)
1+1
end
0.301395 seconds (8 allocations: 336 bytes)
2
julia> @time "A one second sleep" sleep(1)
A one second sleep: 1.005750 seconds (5 allocations: 144 bytes)
julia> for loop in 1:3
@time loop sleep(1)
end
1: 1.006760 seconds (5 allocations: 144 bytes)
2: 1.001263 seconds (5 allocations: 144 bytes)
3: 1.003676 seconds (5 allocations: 144 bytes)Base.@showtime — Macro@showtime exprComme @time mais imprime également l'expression évaluée pour référence.
Ce macro a été ajouté dans Julia 1.8.
Voir aussi @time.
julia> @showtime sleep(1)
sleep(1): 1.002164 secondes (4 allocations: 128 octets)Base.@timev — Macro@timev expr
@timev "description" exprCeci est une version détaillée de la macro @time. Elle imprime d'abord les mêmes informations que @time, puis tout compteur d'allocation mémoire non nul, et retourne ensuite la valeur de l'expression.
Fournissez éventuellement une chaîne de description à imprimer avant le rapport de temps.
L'option d'ajouter une description a été introduite dans Julia 1.8.
Voir aussi @time, @timed, @elapsed, @allocated, et @allocations.
julia> x = rand(10,10);
julia> @timev x * x;
0.546770 seconds (2.20 M allocations: 116.632 MiB, 4.23% gc time, 99.94% compilation time)
elapsed time (ns): 546769547
gc time (ns): 23115606
bytes allocated: 122297811
pool allocs: 2197930
non-pool GC allocs:1327
malloc() calls: 36
realloc() calls: 5
GC pauses: 3
julia> @timev x * x;
0.000010 seconds (1 allocation: 896 bytes)
elapsed time (ns): 9848
bytes allocated: 896
pool allocs: 1Base.@timed — Macro@timedUne macro pour exécuter une expression et retourner la valeur de l'expression, le temps écoulé en secondes, le total des octets alloués, le temps de collecte des ordures, un objet avec divers compteurs d'allocation mémoire, le temps de compilation en secondes et le temps de recompilation en secondes. Tout conflit de verrouillage où un ReentrantLock a dû attendre est affiché sous forme de compte.
Dans certains cas, le système examinera l'expression @timed et compilera une partie du code appelé avant que l'exécution de l'expression de niveau supérieur ne commence. Lorsque cela se produit, une partie du temps de compilation ne sera pas comptabilisée. Pour inclure ce temps, vous pouvez exécuter @timed @eval ....
Voir aussi @time, @timev, @elapsed, @allocated, @allocations et @lock_conflicts.
julia> stats = @timed rand(10^6);
julia> stats.time
0.006634834
julia> stats.bytes
8000256
julia> stats.gctime
0.0055765
julia> propertynames(stats.gcstats)
(:allocd, :malloc, :realloc, :poolalloc, :bigalloc, :freecall, :total_time, :pause, :full_sweep)
julia> stats.gcstats.total_time
5576500
julia> stats.compile_time
0.0
julia> stats.recompile_time
0.0
Le type de retour de cette macro a été changé de Tuple à NamedTuple dans Julia 1.5.
Les champs lock_conflicts, compile_time et recompile_time ont été ajoutés dans Julia 1.11.
Base.@elapsed — Macro@elapsedUne macro pour évaluer une expression, en ignorant la valeur résultante, et en retournant plutôt le nombre de secondes qu'il a fallu pour s'exécuter sous forme de nombre à virgule flottante.
Dans certains cas, le système regardera à l'intérieur de l'expression @elapsed et compilera une partie du code appelé avant que l'exécution de l'expression de niveau supérieur ne commence. Lorsque cela se produit, un certain temps de compilation ne sera pas compté. Pour inclure ce temps, vous pouvez exécuter @elapsed @eval ....
Voir aussi @time, @timev, @timed, @allocated, et @allocations.
julia> @elapsed sleep(0.3)
0.301391426Base.@allocated — Macro@allocatedUne macro pour évaluer une expression, en ignorant la valeur résultante, et en retournant plutôt le nombre total d'octets alloués lors de l'évaluation de l'expression.
Voir aussi @allocations, @time, @timev, @timed, et @elapsed.
julia> @allocated rand(10^6)
8000080Base.@allocations — Macro@allocationsUne macro pour évaluer une expression, ignorer la valeur résultante et retourner plutôt le nombre total d'allocations pendant l'évaluation de l'expression.
Voir aussi @allocated, @time, @timev, @timed, et @elapsed.
julia> @allocations rand(10^6)
2Cette macro a été ajoutée dans Julia 1.9.
Base.@lock_conflicts — Macro@lock_conflictsUne macro pour évaluer une expression, ignorer la valeur résultante et retourner plutôt le nombre total de conflits de verrouillage pendant l'évaluation, où une tentative de verrouillage sur un ReentrantLock a entraîné une attente parce que le verrou était déjà détenu.
Voir aussi @time, @timev et @timed.
julia> @lock_conflicts begin
l = ReentrantLock()
Threads.@threads for i in 1:Threads.nthreads()
lock(l) do
sleep(1)
end
end
end
5Cette macro a été ajoutée dans Julia 1.11.
Base.EnvDict — TypeEnvDict() -> EnvDictUn singleton de ce type fournit une interface de table de hachage aux variables d'environnement.
Base.ENV — ConstantENVRéférence au singleton EnvDict, fournissant une interface de dictionnaire pour les variables d'environnement système.
(Sous Windows, les variables d'environnement système ne tiennent pas compte de la casse, et ENV convertit donc toutes les clés en majuscules pour l'affichage, l'itération et la copie. Le code portable ne doit pas s'appuyer sur la capacité à distinguer les variables par leur casse, et doit être conscient que définir une variable apparemment en minuscules peut entraîner une clé ENV en majuscules.)
La mutation de l'environnement n'est pas thread-safe.
Exemples
julia> ENV
Base.EnvDict avec "50" entrées :
"SECURITYSESSIONID" => "123"
"USER" => "nom_utilisateur"
"MallocNanoZone" => "0"
⋮ => ⋮
julia> ENV["JULIA_EDITOR"] = "vim"
"vim"
julia> ENV["JULIA_EDITOR"]
"vim"Base.Sys.STDLIB — ConstantSys.STDLIB::StringUne chaîne contenant le chemin complet vers le répertoire contenant les packages stdlib.
Base.Sys.isunix — FunctionSys.isunix([os])Prédicat pour tester si le système d'exploitation fournit une interface de type Unix. Voir la documentation dans Handling Operating System Variation.
Base.Sys.isapple — FunctionSys.isapple([os])Prédicat pour tester si le système d'exploitation est un dérivé d'Apple Macintosh OS X ou de Darwin. Voir la documentation dans Handling Operating System Variation.
Base.Sys.islinux — FunctionSys.islinux([os])Prédicat pour tester si le système d'exploitation est un dérivé de Linux. Voir la documentation dans Handling Operating System Variation.
Base.Sys.isbsd — FunctionSys.isbsd([os])Prédicat pour tester si le système d'exploitation est un dérivé de BSD. Voir la documentation dans Handling Operating System Variation.
Le noyau Darwin descend de BSD, ce qui signifie que Sys.isbsd() est true sur les systèmes macOS. Pour exclure macOS d'un prédicat, utilisez Sys.isbsd() && !Sys.isapple().
Base.Sys.isfreebsd — FunctionSys.isfreebsd([os])Prédicat pour tester si le système d'exploitation est un dérivé de FreeBSD. Voir la documentation dans Handling Operating System Variation.
Ne pas confondre avec Sys.isbsd(), qui est true sur FreeBSD mais aussi sur d'autres systèmes basés sur BSD. Sys.isfreebsd() fait référence uniquement à FreeBSD.
Cette fonction nécessite au moins Julia 1.1.
Base.Sys.isopenbsd — FunctionSys.isopenbsd([os])Prédicat pour tester si le système d'exploitation est un dérivé d'OpenBSD. Voir la documentation dans Handling Operating System Variation.
Ne pas confondre avec Sys.isbsd(), qui est true sur OpenBSD mais aussi sur d'autres systèmes basés sur BSD. Sys.isopenbsd() fait référence uniquement à OpenBSD.
Cette fonction nécessite au moins Julia 1.1.
Base.Sys.isnetbsd — FunctionSys.isnetbsd([os])Prédicat pour tester si le système d'exploitation est un dérivé de NetBSD. Voir la documentation dans Handling Operating System Variation.
Ne pas confondre avec Sys.isbsd(), qui est true sur NetBSD mais aussi sur d'autres systèmes basés sur BSD. Sys.isnetbsd() fait référence uniquement à NetBSD.
Cette fonction nécessite au moins Julia 1.1.
Base.Sys.isdragonfly — FunctionSys.isdragonfly([os])Prédicat pour tester si le système d'exploitation est un dérivé de DragonFly BSD. Voir la documentation dans Handling Operating System Variation.
Ne pas confondre avec Sys.isbsd(), qui est true sur DragonFly mais aussi sur d'autres systèmes basés sur BSD. Sys.isdragonfly() fait référence uniquement à DragonFly.
Cette fonction nécessite au moins Julia 1.1.
Base.Sys.iswindows — FunctionSys.iswindows([os])Prédicat pour tester si le système d'exploitation est un dérivé de Microsoft Windows NT. Voir la documentation dans Handling Operating System Variation.
Base.Sys.windows_version — FunctionSys.windows_version()Renvoie le numéro de version pour le noyau Windows NT sous la forme d'un VersionNumber, c'est-à-dire v"major.minor.build", ou v"0.0.0" si cela ne fonctionne pas sous Windows.
Base.Sys.free_memory — FunctionSys.free_memory()Obtenez la mémoire totale libre dans la RAM en octets.
Base.Sys.total_memory — FunctionSys.total_memory()Obtenez la mémoire totale en RAM (y compris celle qui est actuellement utilisée) en octets. Ce montant peut être contraint, par exemple, par les groupes de contrôle Linux. Pour le montant non contraint, voir Sys.total_physical_memory().
Base.Sys.free_physical_memory — FunctionSys.free_physical_memory()Obtenez la mémoire libre du système en octets. La totalité de la mémoire peut ne pas être disponible pour le processus actuel ; utilisez Sys.free_memory() pour le montant réellement disponible.
Base.Sys.total_physical_memory — FunctionSys.total_physical_memory()Obtenez la mémoire totale en RAM (y compris celle qui est actuellement utilisée) en octets. La totalité de la mémoire peut ne pas être disponible pour le processus actuel ; voir Sys.total_memory().
Base.Sys.uptime — FunctionSys.uptime()Obtient le temps de fonctionnement actuel du système en secondes.
Base.Sys.isjsvm — FunctionSys.isjsvm([os])Prédicat pour tester si Julia s'exécute dans une machine virtuelle JavaScript (JSVM), y compris par exemple un embedding JavaScript WebAssembly dans un navigateur web.
Cette fonction nécessite au moins Julia 1.2.
Base.Sys.loadavg — FunctionSys.loadavg()Obtenez la moyenne de charge. Voir : https://en.wikipedia.org/wiki/Load_(computing).
Base.Sys.isexecutable — Functionisexecutable(path::String)Retourne true si le path donné a des permissions d'exécution.
Cette permission peut changer avant que l'utilisateur n'exécute path, il est donc recommandé d'exécuter le fichier et de gérer l'erreur si cela échoue, plutôt que d'appeler isexecutable en premier.
Avant Julia 1.6, cela n'interrogeait pas correctement les ACL du système de fichiers sur Windows, par conséquent, cela retournerait true pour n'importe quel fichier. À partir de Julia 1.6, cela détermine correctement si le fichier est marqué comme exécutable ou non.
Voir aussi ispath, isreadable, iswritable.
Base.Sys.isreadable — Functionisreadable(path::String)Retourne true si les permissions d'accès pour le path donné permettent la lecture par l'utilisateur actuel.
Cette permission peut changer avant que l'utilisateur n'appelle open, il est donc recommandé d'appeler simplement open seul et de gérer l'erreur si cela échoue, plutôt que d'appeler isreadable en premier.
Actuellement, cette fonction n'interroge pas correctement les ACL du système de fichiers sur Windows, elle peut donc renvoyer des résultats incorrects.
Cette fonction nécessite au moins Julia 1.11.
Voir aussi ispath, isexecutable, iswritable.
isreadable(io) -> BoolRetourne false si l'objet IO spécifié n'est pas lisible.
Exemples
julia> open("myfile.txt", "w") do io
print(io, "Hello world!");
isreadable(io)
end
false
julia> open("myfile.txt", "r") do io
isreadable(io)
end
true
julia> rm("myfile.txt")Base.Sys.iswritable — Functioniswritable(path::String)Retourne true si les permissions d'accès pour le path donné permettent l'écriture par l'utilisateur actuel.
Cette permission peut changer avant que l'utilisateur n'appelle open, il est donc recommandé d'appeler simplement open seul et de gérer l'erreur si cela échoue, plutôt que d'appeler iswritable d'abord.
Actuellement, cette fonction n'interroge pas correctement les ACL du système de fichiers sur Windows, elle peut donc renvoyer des résultats incorrects.
Cette fonction nécessite au moins Julia 1.11.
Voir aussi ispath, isexecutable, isreadable.
iswritable(io) -> BoolRetourne false si l'objet IO spécifié n'est pas écrivable.
Exemples
julia> open("myfile.txt", "w") do io
print(io, "Hello world!");
iswritable(io)
end
true
julia> open("myfile.txt", "r") do io
iswritable(io)
end
false
julia> rm("myfile.txt")Base.Sys.username — FunctionSys.username() -> StringRenvoie le nom d'utilisateur pour l'utilisateur actuel. Si le nom d'utilisateur ne peut pas être déterminé ou est vide, cette fonction génère une erreur.
Pour récupérer un nom d'utilisateur qui peut être remplacé via une variable d'environnement, par exemple, USER, envisagez d'utiliser
user = get(Sys.username, ENV, "USER")Cette fonction nécessite au moins Julia 1.11.
Voir aussi homedir.
Base.@static — Macro@staticÉvalue partiellement une expression au moment de l'analyse.
Par exemple, @static Sys.iswindows() ? foo : bar évaluera Sys.iswindows() et insérera soit foo soit bar dans l'expression. Cela est utile dans les cas où une construction serait invalide sur d'autres plateformes, comme un ccall à une fonction inexistante. @static if Sys.isapple() foo end et @static foo <&&,||> bar sont également une syntaxe valide.
Versioning
Base.VersionNumber — TypeVersionNumberType de numéro de version qui suit les spécifications de versionnement sémantique (semver), composé de valeurs numériques majeures, mineures et de correctifs, suivies d'annotations alphanumériques de pré-version et de construction.
Les objets VersionNumber peuvent être comparés avec tous les opérateurs de comparaison standard (==, <, <=, etc.), le résultat suivant les règles de semver.
VersionNumber a les champs publics suivants :
v.major::Integerv.minor::Integerv.patch::Integerv.prerelease::Tuple{Vararg{Union{Integer, AbstractString}}}v.build::Tuple{Vararg{Union{Integer, AbstractString}}}
Voir aussi @v_str pour construire efficacement des objets VersionNumber à partir de chaînes littérales au format semver, VERSION pour le VersionNumber de Julia lui-même, et Littéraux de Numéro de Version dans le manuel.
Exemples
julia> a = VersionNumber(1, 2, 3)
v"1.2.3"
julia> a >= v"1.2"
true
julia> b = VersionNumber("2.0.1-rc1")
v"2.0.1-rc1"
julia> b >= v"2.0.1"
falseBase.@v_str — Macro@v_strMacro de chaîne utilisée pour analyser une chaîne en un VersionNumber.
Exemples
julia> v"1.2.3"
v"1.2.3"
julia> v"2.0.1-rc1"
v"2.0.1-rc1"Errors
Base.error — Functionerror(message::AbstractString)Lève une ErrorException avec le message donné.
error(msg...)Lève une ErrorException avec un message construit par string(msg...).
Core.throw — FunctionBase.rethrow — Functionrethrow()Relance l'exception actuelle depuis un bloc catch. L'exception relancée continuera sa propagation comme si elle n'avait pas été interceptée.
La forme alternative rethrow(e) vous permet d'associer un objet d'exception alternatif e avec la trace de pile actuelle. Cependant, cela déforme l'état du programme au moment de l'erreur, donc il est conseillé de lancer plutôt une nouvelle exception en utilisant throw(e). Dans Julia 1.1 et versions ultérieures, l'utilisation de throw(e) préservera l'exception de cause racine sur la pile, comme décrit dans current_exceptions.
Base.backtrace — Functionbacktrace()Obtenez un objet backtrace pour le point de programme actuel.
Base.catch_backtrace — Functioncatch_backtrace()Obtenez la trace de la pile de l'exception actuelle, à utiliser dans les blocs catch.
Base.current_exceptions — Functioncurrent_exceptions(task::Task=current_task(); [backtrace::Bool=true])Obtenez la pile des exceptions actuellement gérées. Pour les blocs catch imbriqués, il peut y avoir plus d'une exception actuelle, auquel cas l'exception lancée le plus récemment est la dernière dans la pile. La pile est renvoyée sous la forme d'un ExceptionStack, qui est un AbstractVector de tuples nommés (exception,backtrace). Si backtrace est faux, la trace de la pile dans chaque paire sera définie sur nothing.
Passer explicitement task renverra la pile d'exceptions actuelle sur une tâche arbitraire. Cela est utile pour inspecter les tâches qui ont échoué en raison d'exceptions non interceptées.
Cette fonction était connue sous le nom expérimental de catch_stack() dans Julia 1.1–1.6, et avait un type de retour de Vector de tuples simple.
Base.@assert — Macro@assert cond [texte]Lance une AssertionError si cond est false. C'est la syntaxe préférée pour écrire des assertions, qui sont des conditions supposées vraies, mais que l'utilisateur pourrait décider de vérifier de toute façon, comme aide au débogage en cas d'échec. Le message optionnel texte est affiché en cas d'échec de l'assertion.
Une assertion peut être désactivée à certains niveaux d'optimisation. Les assertions ne doivent donc être utilisées qu'en tant qu'outil de débogage et ne doivent pas être utilisées pour la vérification d'authentification (par exemple, vérifier des mots de passe ou vérifier les limites des tableaux). Le code ne doit pas dépendre des effets secondaires de l'exécution de cond pour le bon comportement d'une fonction.
Exemples
julia> @assert iseven(3) "3 est un nombre impair !"
ERROR: AssertionError: 3 est un nombre impair !
julia> @assert isodd(3) "Qu'est-ce qu'un nombre pair ?"Base.Experimental.register_error_hint — FunctionExperimental.register_error_hint(handler, exceptiontype)Enregistrez une fonction de "sugestion" handler(io, exception) qui peut suggérer des moyens potentiels pour les utilisateurs de contourner les erreurs. handler doit examiner exception pour voir si les conditions appropriées pour une suggestion sont remplies, et si c'est le cas, générer une sortie vers io. Les packages doivent appeler register_error_hint depuis leur fonction __init__.
Pour des types d'exception spécifiques, handler doit accepter des arguments supplémentaires :
MethodError: fournirhandler(io, exc::MethodError, argtypes, kwargs), qui divise les arguments combinés en arguments positionnels et en arguments de mot-clé.
Lors de l'émission d'une suggestion, la sortie doit généralement commencer par \n.
Si vous définissez des types d'exception personnalisés, votre méthode showerror peut prendre en charge les suggestions en appelant Experimental.show_error_hints.
Exemples
julia> module Hinter
only_int(x::Int) = 1
any_number(x::Number) = 2
function __init__()
Base.Experimental.register_error_hint(MethodError) do io, exc, argtypes, kwargs
if exc.f == only_int
# La couleur n'est pas nécessaire, c'est juste pour montrer que c'est possible.
print(io, "\nVouliez-vous appeler ")
printstyled(io, "`any_number`?", color=:cyan)
end
end
end
endAlors si vous appelez Hinter.only_int sur quelque chose qui n'est pas un Int (déclenchant ainsi un MethodError), cela émet la suggestion :
julia> Hinter.only_int(1.0)
ERROR: MethodError: no method matching only_int(::Float64)
La fonction `only_int` existe, mais aucune méthode n'est définie pour cette combinaison de types d'arguments.
Vouliez-vous appeler `any_number` ?
Les candidats les plus proches sont :
...Les suggestions d'erreurs personnalisées sont disponibles depuis Julia 1.5.
Cette interface est expérimentale et sujette à des changements ou à une suppression sans préavis. Pour vous protéger contre les changements, envisagez de mettre toutes les inscriptions à l'intérieur d'un bloc if isdefined(Base.Experimental, :register_error_hint) ... end.
Base.Experimental.show_error_hints — FunctionExperimental.show_error_hints(io, ex, args...)Invoquez tous les gestionnaires de Experimental.register_error_hint pour le type d'exception particulier typeof(ex). args doit contenir tous les autres arguments attendus par le gestionnaire pour ce type.
Les indices d'erreur personnalisés sont disponibles depuis Julia 1.5.
Cette interface est expérimentale et sujette à des modifications ou à une suppression sans préavis.
Core.ArgumentError — TypeArgumentError(msg)Les arguments passés à une fonction sont invalides. msg est un message d'erreur descriptif.
Core.AssertionError — TypeAssertionError([msg])La condition affirmée n'a pas été évaluée à true. L'argument optionnel msg est une chaîne de caractères descriptive d'erreur.
Exemples
julia> @assert false "ceci n'est pas vrai"
ERROR: AssertionError: ceci n'est pas vraiAssertionError est généralement lancé par @assert. ```
Core.BoundsError — TypeBoundsError([a],[i])Une opération d'indexation dans un tableau, a, a tenté d'accéder à un élément hors limites à l'index i.
Exemples
julia> A = fill(1.0, 7);
julia> A[8]
ERREUR : BoundsError : tentative d'accès à un Vector{Float64} de 7 éléments à l'index [8]
julia> B = fill(1.0, (2,3));
julia> B[2, 4]
ERREUR : BoundsError : tentative d'accès à un Matrix{Float64} de 2×3 à l'index [2, 4]
julia> B[9]
ERREUR : BoundsError : tentative d'accès à un Matrix{Float64} de 2×3 à l'index [9]
Base.CompositeException — TypeCompositeExceptionEnveloppe un Vector d'exceptions levées par une Task (par exemple, générées par un travailleur distant via un canal ou une écriture I/O locale exécutée de manière asynchrone ou un travailleur distant sous pmap) avec des informations sur la série d'exceptions. Par exemple, si un groupe de travailleurs exécute plusieurs tâches, et que plusieurs travailleurs échouent, le CompositeException résultant contiendra un "paquet" d'informations de chaque travailleur indiquant où et pourquoi l(es) exception(s) s'est/sont produite(s).
Base.DimensionMismatch — TypeDimensionMismatch([msg])Les objets appelés n'ont pas de dimensions correspondantes. L'argument optionnel msg est une chaîne de caractères descriptive d'erreur.
Core.DivideError — TypeDivideError()Une division entière a été tentée avec une valeur de dénominateur de 0.
Exemples
julia> 2/0
Inf
julia> div(2, 0)
ERREUR: DivideError: erreur de division entière
Trace de la pile :
[...]Core.DomainError — TypeDomainError(val)
DomainError(val, msg)L'argument val d'une fonction ou d'un constructeur est en dehors du domaine valide.
Exemples
julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt a été appelé avec un argument réel négatif mais ne renverra un résultat complexe que s'il est appelé avec un argument complexe. Essayez sqrt(Complex(x)).
Stacktrace:
[...]Base.EOFError — TypeEOFError()Aucune donnée supplémentaire n'était disponible à lire à partir d'un fichier ou d'un flux.
Core.ErrorException — TypeErrorException(msg)Type d'erreur générique. Le message d'erreur, dans le champ .msg, peut fournir des détails plus spécifiques.
Exemples
julia> ex = ErrorException("J'ai fait une mauvaise chose");
julia> ex.msg
"J'ai fait une mauvaise chose"Core.InexactError — TypeInexactError(name::Symbol, T, val)Impossible de convertir exactement val en type T dans une méthode de la fonction name.
Exemples
julia> convert(Float64, 1+2im)
ERROR: InexactError: Float64(1 + 2im)
Stacktrace:
[...]Core.InterruptException — TypeInterruptException()Le processus a été arrêté par une interruption du terminal (CTRL+C).
Notez que, dans un script Julia démarré sans l'option -i (interactive), InterruptException n'est pas lancé par défaut. Appeler Base.exit_on_sigint(false) dans le script peut rétablir le comportement du REPL. Alternativement, un script Julia peut être démarré avec
julia -e "include(popfirst!(ARGS))" script.jlpour permettre à InterruptException d'être lancé par CTRL+C pendant l'exécution.
Base.KeyError — TypeKeyError(key)Une opération d'indexation dans un AbstractDict (Dict) ou un objet de type Set a tenté d'accéder ou de supprimer un élément inexistant.
Core.LoadError — TypeLoadError(file::AbstractString, line::Int, error)Une erreur s'est produite lors de include, require ou using d'un fichier. Les détails de l'erreur devraient être disponibles dans le champ .error.
Les LoadErrors ne sont plus émis par @macroexpand, @macroexpand1 et macroexpand depuis Julia 1.7.
Core.MethodError — TypeMethodError(f, args)Un méthode avec la signature de type requise n'existe pas dans la fonction générique donnée. Alternativement, il n'y a pas de méthode la plus spécifique unique.
Base.MissingException — TypeMissingException(msg)Exception levée lorsqu'une valeur missing est rencontrée dans une situation où elle n'est pas supportée. Le message d'erreur, dans le champ msg, peut fournir des détails plus spécifiques.
Core.OutOfMemoryError — TypeOutOfMemoryError()Une opération a alloué trop de mémoire pour que le système ou le ramasse-miettes puisse gérer correctement.
Core.ReadOnlyMemoryError — TypeReadOnlyMemoryError()Une opération a tenté d'écrire dans une mémoire qui est en lecture seule.
Core.OverflowError — TypeOverflowError(msg)Le résultat d'une expression est trop grand pour le type spécifié et provoquera un débordement.
Base.ProcessFailedException — TypeProcessFailedExceptionIndique un statut de sortie problématique d'un processus. Lors de l'exécution de commandes ou de pipelines, cela est lancé pour indiquer qu'un code de sortie non nul a été retourné (c'est-à-dire que le processus invoqué a échoué).
Base.TaskFailedException — TypeTaskFailedExceptionCette exception est lancée par un appel à wait(t) lorsque la tâche t échoue. TaskFailedException enveloppe la tâche échouée t.
Core.StackOverflowError — TypeStackOverflowError()L'appel de fonction a dépassé la taille de la pile d'appels. Cela se produit généralement lorsqu'un appel se récursive indéfiniment.
Base.SystemError — TypeSystemError(prefix::AbstractString, [errno::Int32])Un appel système a échoué avec un code d'erreur (dans la variable globale errno).
Core.TypeError — TypeTypeError(func::Symbol, context::AbstractString, expected::Type, got)Une erreur d'assertion de type, ou l'appel d'une fonction intrinsèque avec un type d'argument incorrect.
Core.UndefKeywordError — TypeUndefKeywordError(var::Symbol)L'argument clé requis var n'a pas été assigné dans un appel de fonction.
Exemples
julia> function my_func(;my_arg)
return my_arg + 1
end
my_func (generic function with 1 method)
julia> my_func()
ERROR: UndefKeywordError: keyword argument `my_arg` not assigned
Stacktrace:
[1] my_func() at ./REPL[1]:2
[2] top-level scope at REPL[2]:1Core.UndefRefError — TypeUndefRefError()L'élément ou le champ n'est pas défini pour l'objet donné.
Exemples
julia> struct MyType
a::Vector{Int}
MyType() = new()
end
julia> A = MyType()
MyType(#undef)
julia> A.a
ERROR: UndefRefError: accès à une référence indéfinie
Stacktrace:
[...]Core.UndefVarError — TypeUndefVarError(var::Symbol, [scope])Un symbole dans le scope actuel n'est pas défini.
Exemples
julia> a
ERROR: UndefVarError: `a` not defined in `Main`
julia> a = 1;
julia> a
1Base.StringIndexError — TypeStringIndexError(str, i)Une erreur s'est produite lors de la tentative d'accès à str à l'index i qui n'est pas valide.
Core.InitError — TypeInitError(mod::Symbol, error)Une erreur s'est produite lors de l'exécution de la fonction __init__ d'un module. L'erreur réelle levée est disponible dans le champ .error.
Base.retry — Functionretry(f; delays=ExponentialBackOff(), check=nothing) -> FunctionRenvoie une fonction anonyme qui appelle la fonction f. Si une exception se produit, f est appelée à nouveau, chaque fois que check renvoie true, après avoir attendu le nombre de secondes spécifié dans delays. check doit entrer l'état actuel de delays et l'Exception.
Avant Julia 1.2, cette signature était limitée à f::Function.
Exemples
retry(f, delays=fill(5.0, 3))
retry(f, delays=rand(5:10, 2))
retry(f, delays=Base.ExponentialBackOff(n=3, first_delay=5, max_delay=1000))
retry(http_get, check=(s,e)->e.status == "503")(url)
retry(read, check=(s,e)->isa(e, IOError))(io, 128; all=false)Base.ExponentialBackOff — TypeExponentialBackOff(; n=1, first_delay=0.05, max_delay=10.0, factor=5.0, jitter=0.1)Un itérateur Float64 de longueur n dont les éléments augmentent exponentiellement à un rythme dans l'intervalle factor * (1 ± jitter). Le premier élément est first_delay et tous les éléments sont limités à max_delay.
Events
Base.Timer — MethodTimer(callback::Function, delay; interval = 0)Créez un minuteur qui exécute la fonction callback à chaque expiration du minuteur.
Les tâches en attente sont réveillées et la fonction callback est appelée après un délai initial de delay secondes, puis se répète avec l'intervalle donné en secondes. Si interval est égal à 0, le callback n'est exécuté qu'une seule fois. La fonction callback est appelée avec un seul argument, le minuteur lui-même. Arrêtez un minuteur en appelant close. Le callback peut encore être exécuté une dernière fois, si le minuteur a déjà expiré.
Exemples
Ici, le premier nombre est imprimé après un délai de deux secondes, puis les nombres suivants sont imprimés rapidement.
julia> begin
i = 0
cb(timer) = (global i += 1; println(i))
t = Timer(cb, 2, interval=0.2)
wait(t)
sleep(0.5)
close(t)
end
1
2
3Base.Timer — TypeTimer(delay; interval = 0)Créez un minuteur qui réveille les tâches en attente (en appelant wait sur l'objet minuteur).
Les tâches en attente sont réveillées après un délai initial d'au moins delay secondes, puis se répètent après qu'au moins interval secondes se soient écoulées à nouveau. Si interval est égal à 0, le minuteur est déclenché une seule fois. Lorsque le minuteur est fermé (en appelant close), les tâches en attente sont réveillées avec une erreur. Utilisez isopen pour vérifier si un minuteur est toujours actif.
interval est sujet à l'accumulation de décalage temporel. Si vous avez besoin d'événements précis à un moment absolu particulier, créez un nouveau minuteur à chaque expiration avec la différence jusqu'au prochain moment calculée.
Un Timer nécessite des points de yield pour mettre à jour son état. Par exemple, isopen(t::Timer) ne peut pas être utilisé pour temporiser une boucle while non-yielding.
Base.AsyncCondition — TypeAsyncCondition()Créez une condition asynchrone qui réveille les tâches qui l'attendent (en appelant wait sur l'objet) lorsqu'elle est notifiée depuis C par un appel à uv_async_send. Les tâches en attente sont réveillées avec une erreur lorsque l'objet est fermé (par close). Utilisez isopen pour vérifier si elle est toujours active.
Cela fournit un ordre de mémoire implicite d'acquisition et de libération entre les threads d'envoi et d'attente.
Base.AsyncCondition — MethodAsyncCondition(callback::Function)Créez une condition asynchrone qui appelle la fonction callback donnée. Le callback reçoit un argument, l'objet de condition asynchrone lui-même.
Reflection
Base.nameof — Methodnameof(m::Module) -> SymbolObtenez le nom d'un Module sous forme de Symbol.
Exemples
julia> nameof(Base.Broadcast)
:BroadcastBase.parentmodule — Functionparentmodule(m::Module) -> ModuleObtenez le Module englobant d'un module. Main est son propre parent.
Voir aussi : names, nameof, fullname, @__MODULE__.
Exemples
julia> parentmodule(Main)
Main
julia> parentmodule(Base.Broadcast)
Baseparentmodule(t::DataType) -> ModuleDéterminez le module contenant la définition d'un DataType (potentiellement enveloppé dans UnionAll).
Exemples
julia> module Foo
struct Int end
end
Foo
julia> parentmodule(Int)
Core
julia> parentmodule(Foo.Int)
Fooparentmodule(f::Function) -> ModuleDéterminez le module contenant la (première) définition d'une fonction générique.
parentmodule(f::Function, types) -> ModuleDéterminez le module contenant la première méthode d'une fonction générique f correspondant aux types spécifiés.
parentmodule(m::Method) -> ModuleRenvoie le module dans lequel la méthode donnée m est définie.
Passer un Method comme argument nécessite Julia 1.9 ou une version ultérieure.
Base.pathof — Methodpathof(m::Module)Retourne le chemin du fichier m.jl qui a été utilisé pour importer le module m, ou nothing si m n'a pas été importé d'un package.
Utilisez dirname pour obtenir la partie répertoire et basename pour obtenir la partie nom de fichier du chemin.
Voir aussi pkgdir.
Base.pkgdir — Methodpkgdir(m::Module[, paths::String...])Renvoie le répertoire racine du package qui a déclaré le module m, ou nothing si m n'a pas été déclaré dans un package. Des chaînes de composants de chemin supplémentaires peuvent être fournies pour construire un chemin dans le répertoire racine du package.
Pour obtenir le répertoire racine du package qui implémente le module actuel, la forme pkgdir(@__MODULE__) peut être utilisée.
Si un module d'extension est donné, la racine du package parent est renvoyée.
julia> pkgdir(Foo)
"/path/to/Foo.jl"
julia> pkgdir(Foo, "src", "file.jl")
"/path/to/Foo.jl/src/file.jl"Voir aussi pathof.
L'argument optionnel paths nécessite au moins Julia 1.7.
Base.pkgversion — Methodpkgversion(m::Module)Renvoie la version du package qui a importé le module m, ou nothing si m n'a pas été importé d'un package, ou importé d'un package sans champ de version défini.
La version est lue à partir du Project.toml du package lors du chargement du package.
Pour obtenir la version du package qui a importé le module actuel, la forme pkgversion(@__MODULE__) peut être utilisée.
Cette fonction a été introduite dans Julia 1.9.
Base.moduleroot — Functionmoduleroot(m::Module) -> ModuleTrouvez le module racine d'un module donné. C'est le premier module dans la chaîne des modules parents de m qui est soit un module racine enregistré, soit qui est son propre module parent.
__module__ — Keyword__module__L'argument __module__ n'est visible qu'à l'intérieur de la macro, et il fournit des informations (sous la forme d'un objet Module) sur le contexte d'expansion de l'invocation de la macro. Voir la section du manuel sur Macro invocation pour plus d'informations.
__source__ — Keyword__source__L'argument __source__ n'est visible qu'à l'intérieur de la macro, et il fournit des informations (sous la forme d'un objet LineNumberNode) sur l'emplacement du parseur du signe @ à partir de l'invocation de la macro. Voir la section du manuel sur Macro invocation pour plus d'informations.
Base.@__MODULE__ — Macro@__MODULE__ -> ModuleObtenez le Module de l'évaluation de niveau supérieur, qui est le Module à partir duquel le code est actuellement lu.
Base.@__FILE__ — Macro@__FILE__ -> StringDéveloppe en une chaîne avec le chemin vers le fichier contenant l'appel de macro, ou une chaîne vide si évalué par julia -e <expr>. Retourne nothing si la macro manquait d'informations sur la source du parseur. Voir alternativement PROGRAM_FILE.
Base.@__DIR__ — Macro@__DIR__ -> StringMacro pour obtenir le chemin absolu du répertoire actuel sous forme de chaîne.
S'il est utilisé dans un script, renvoie le répertoire du script contenant l'appel de macro @__DIR__. S'il est exécuté depuis un REPL ou s'il est évalué par julia -e <expr>, renvoie le répertoire de travail actuel.
Exemples
L'exemple illustre la différence de comportement entre @__DIR__ et pwd(), en créant un script simple dans un répertoire différent de celui de travail actuel et en exécutant les deux commandes :
julia> cd("/home/JuliaUser") # répertoire de travail
julia> # créer un script à /home/JuliaUser/Projects
open("/home/JuliaUser/Projects/test.jl","w") do io
print(io, """
println("@__DIR__ = ", @__DIR__)
println("pwd() = ", pwd())
""")
end
julia> # affiche le répertoire du script et le répertoire de travail actuel
include("/home/JuliaUser/Projects/test.jl")
@__DIR__ = /home/JuliaUser/Projects
pwd() = /home/JuliaUserBase.@__LINE__ — Macro@__LINE__ -> IntDéveloppe à la numéro de ligne de l'emplacement de l'appel de macro. Retourne 0 si le numéro de ligne ne peut pas être déterminé.
Base.fullname — Functionfullname(m::Module)Obtenez le nom entièrement qualifié d'un module sous forme de tuple de symboles. Par exemple,
Exemples
julia> fullname(Base.Iterators)
(:Base, :Iterators)
julia> fullname(Main)
(:Main,)Base.names — Functionnames(x::Module; all::Bool = false, imported::Bool = false)Obtenez un vecteur des noms publics d'un Module, en excluant les noms obsolètes. Si all est vrai, la liste inclut également les noms non publics définis dans le module, les noms obsolètes et les noms générés par le compilateur. Si imported est vrai, alors les noms explicitement importés d'autres modules sont également inclus. Les noms sont retournés dans un ordre trié.
En tant que cas particulier, tous les noms définis dans Main sont considérés comme "publics", car il n'est pas idiomatique de marquer explicitement les noms de Main comme publics.
sym ∈ names(SomeModule) ne signifie pas isdefined(SomeModule, sym). names renverra des symboles marqués avec public ou export, même s'ils ne sont pas définis dans le module.
Voir aussi : Base.isexported, Base.ispublic, Base.@locals, @__MODULE__.
Base.isexported — Functionisexported(m::Module, s::Symbol) -> BoolRenvoie si un symbole est exporté d'un module.
julia> module Mod
export foo
public bar
end
Mod
julia> Base.isexported(Mod, :foo)
true
julia> Base.isexported(Mod, :bar)
false
julia> Base.isexported(Mod, :baz)
falseBase.ispublic — Functionispublic(m::Module, s::Symbol) -> BoolRenvoie si un symbole est marqué comme public dans un module.
Les symboles exportés sont considérés comme publics.
Cette fonction et la notion de publicité ont été ajoutées dans Julia 1.11.
Voir aussi : isexported, names
julia> module Mod
export foo
public bar
end
Mod
julia> Base.ispublic(Mod, :foo)
true
julia> Base.ispublic(Mod, :bar)
true
julia> Base.ispublic(Mod, :baz)
falseBase.nameof — Methodnameof(f::Function) -> SymbolObtenez le nom d'une Function générique sous forme de symbole. Pour les fonctions anonymes, il s'agit d'un nom généré par le compilateur. Pour les sous-types de Function déclarés explicitement, c'est le nom du type de la fonction.
Base.functionloc — Methodfunctionloc(f::Function, types)Renvoie un tuple (nom_fichier, ligne) donnant l'emplacement d'une définition de Function générique.
Base.functionloc — Methodfunctionloc(m::Method)Renvoie un tuple (nom_fichier, ligne) donnant l'emplacement d'une définition de Method.
Base.@locals — Macro@locals()Construit un dictionnaire des noms (sous forme de symboles) et des valeurs de toutes les variables locales définies au moment de l'appel.
Ce macro nécessite au moins Julia 1.1.
Exemples
julia> let x = 1, y = 2
Base.@locals
end
Dict{Symbol, Any} avec 2 entrées :
:y => 2
:x => 1
julia> function f(x)
local y
show(Base.@locals); println()
for i = 1:1
show(Base.@locals); println()
end
y = 2
show(Base.@locals); println()
nothing
end;
julia> f(42)
Dict{Symbol, Any}(:x => 42)
Dict{Symbol, Any}(:i => 1, :x => 42)
Dict{Symbol, Any}(:y => 2, :x => 42)Core.getglobal — Functiongetglobal(module::Module, name::Symbol, [order::Symbol=:monotonic])Récupère la valeur de la liaison name du module module. En option, un ordre atomique peut être défini pour l'opération, sinon il est par défaut monotone.
Bien que l'accès aux liaisons de module en utilisant getfield soit toujours pris en charge pour maintenir la compatibilité, l'utilisation de getglobal doit toujours être préférée car getglobal permet de contrôler l'ordre atomique (getfield est toujours monotone) et signifie mieux l'intention du code tant pour l'utilisateur que pour le compilateur.
La plupart des utilisateurs ne devraient pas avoir à appeler cette fonction directement – La fonction getproperty ou la syntaxe correspondante (c'est-à-dire module.name) devrait être préférée dans tous les cas sauf quelques cas d'utilisation très spécifiques.
Cette fonction nécessite Julia 1.9 ou une version ultérieure.
Voir aussi getproperty et setglobal!.
Exemples
julia> a = 1
1
julia> module M
a = 2
end;
julia> getglobal(@__MODULE__, :a)
1
julia> getglobal(M, :a)
2Core.setglobal! — Functionsetglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])Définissez ou changez la valeur de la liaison name dans le module module à x. Aucune conversion de type n'est effectuée, donc si un type a déjà été déclaré pour la liaison, x doit être du type approprié ou une erreur est levée.
De plus, un ordre atomique peut être spécifié pour cette opération, sinon il par défaut à monotone.
Les utilisateurs accéderont généralement à cette fonctionnalité via la fonction setproperty! ou la syntaxe correspondante (c'est-à-dire module.name = x) à la place, donc cela est destiné uniquement à des cas d'utilisation très spécifiques.
Cette fonction nécessite Julia 1.9 ou une version ultérieure.
Voir aussi setproperty! et getglobal
Exemples
julia> module M; global a; end;
julia> M.a # même que `getglobal(M, :a)`
ERROR: UndefVarError: `a` non défini dans `M`
Suggestion : ajoutez un import ou une affectation appropriée. Ce global a été déclaré mais non assigné.
Stacktrace:
[1] getproperty(x::Module, f::Symbol)
@ Base ./Base.jl:42
[2] top-level scope
@ none:1
julia> setglobal!(M, :a, 1)
1
julia> M.a
1Core.modifyglobal! — Functionmodifyglobal!(module::Module, name::Symbol, op, x, [order::Symbol=:monotonic]) -> PairEffectuer atomiquement les opérations pour obtenir et définir un global après avoir appliqué la fonction op.
Cette fonction nécessite Julia 1.11 ou une version ultérieure.
Voir aussi modifyproperty! et setglobal!.
Core.swapglobal! — Functionswapglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])Effectuer atomiquement les opérations pour obtenir et définir simultanément un global.
Cette fonction nécessite Julia 1.11 ou une version ultérieure.
Voir aussi swapproperty! et setglobal!.
Core.setglobalonce! — Functionsetglobalonce!(module::Module, name::Symbol, value,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> success::BoolEffectuer atomiquement les opérations pour définir une variable globale à une valeur donnée, uniquement si elle n'était pas précédemment définie.
Cette fonction nécessite Julia 1.11 ou une version ultérieure.
Voir aussi setpropertyonce! et setglobal!.
Core.replaceglobal! — Functionreplaceglobal!(module::Module, name::Symbol, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)Effectuer atomiquement les opérations pour obtenir et conditionnellement définir une variable globale à une valeur donnée.
Cette fonction nécessite Julia 1.11 ou une version ultérieure.
Voir aussi replaceproperty! et setglobal!.
Documentation
(Voir aussi le chapitre documentation.)
Core.@doc — MacroDocumentation
Les fonctions, méthodes et types peuvent être documentés en plaçant une chaîne de caractères avant la définition :
"""
# La fonction Foo
`foo(x)`: Foo le diable vivant hors de `x`.
"""
foo(x) = ...Le macro @doc peut être utilisé directement pour définir et récupérer la documentation / les métadonnées. Le macro a un parsing spécial afin que l'objet documenté puisse apparaître sur la ligne suivante :
@doc "blah"
function foo() ...Par défaut, la documentation est écrite en Markdown, mais tout objet peut être utilisé comme premier argument.
Documenter des objets séparément de leurs définitions
Vous pouvez documenter un objet avant ou après sa définition avec
@doc "foo" function_to_doc
@doc "bar" TypeToDocPour les macros, la syntaxe est @doc "macro doc" :(Module.@macro) ou @doc "macro doc" :(string_macro"") pour les macros de chaîne. Sans les guillemets :(), l'expansion de la macro sera documentée.
Récupérer la documentation
Vous pouvez récupérer la documentation pour les fonctions, macros et autres objets comme suit :
@doc foo
@doc @time
@doc md""Fonctions & Méthodes
Placer la documentation avant une définition de méthode (par exemple function foo() ... ou foo() = ...) fera en sorte que cette méthode spécifique soit documentée, par opposition à la fonction entière. Les docs des méthodes sont concaténées dans l'ordre où elles ont été définies pour fournir des docs pour la fonction.
Base.Docs.HTML — TypeHTML(s): Créez un objet qui rend s en html.
HTML("<div>foo</div>")Vous pouvez également utiliser un flux pour de grandes quantités de données :
HTML() do io
println(io, "<div>foo</div>")
endHTML est actuellement exporté pour maintenir la compatibilité ascendante, mais cet export est obsolète. Il est recommandé d'utiliser ce type comme Docs.HTML ou de l'importer explicitement depuis Docs.
Base.Docs.Text — TypeText(s): Créez un objet qui rend s en tant que texte brut.
Text("foo")Vous pouvez également utiliser un flux pour de grandes quantités de données :
Text() do io
println(io, "foo")
endText est actuellement exporté pour maintenir la compatibilité avec les versions antérieures, mais cet export est obsolète. Il est recommandé d'utiliser ce type comme Docs.Text ou de l'importer explicitement depuis Docs.
Base.Docs.hasdoc — FunctionDocs.hasdoc(mod::Module, sym::Symbol)::BoolRetourne true si sym dans mod a une docstring et false sinon.
Base.Docs.undocumented_names — Functionundocumented_names(mod::Module; private=false)Renvoie un vecteur trié de symboles non documentés dans module (c'est-à-dire, sans docstrings). private=false (la valeur par défaut) renvoie uniquement les identifiants déclarés avec public et/ou export, tandis que private=true renvoie tous les symboles dans le module (à l'exception des symboles cachés générés par le compilateur commençant par #).
Voir aussi : names, Docs.hasdoc, Base.ispublic.
Code loading
Base.identify_package — FunctionBase.identify_package(name::String)::Union{PkgId, Nothing}
Base.identify_package(where::Union{Module,PkgId}, name::String)::Union{PkgId, Nothing}Identifiez le package par son nom à partir de la pile d'environnement actuelle, renvoyant son PkgId, ou nothing s'il ne peut pas être trouvé.
Si seul l'argument name est fourni, il recherche dans chaque environnement de la pile et ses dépendances directes nommées.
L'argument where fournit le contexte à partir duquel rechercher le package : dans ce cas, il vérifie d'abord si le nom correspond au contexte lui-même, sinon il recherche toutes les dépendances récursives (à partir du manifeste résolu de chaque environnement) jusqu'à ce qu'il localise le contexte where, et à partir de là identifie la dépendance avec le nom correspondant.
julia> Base.identify_package("Pkg") # Pkg est une dépendance de l'environnement par défaut
Pkg [44cfe95a-1eb2-52ea-b672-e2afdf69b78f]
julia> using LinearAlgebra
julia> Base.identify_package(LinearAlgebra, "Pkg") # Pkg n'est pas une dépendance de LinearAlgebraBase.locate_package — FunctionBase.locate_package(pkg::PkgId)::Union{String, Nothing}Le chemin vers le fichier d'entrée pour le package correspondant à l'identifiant pkg, ou nothing s'il n'est pas trouvé. Voir aussi identify_package.
julia> pkg = Base.identify_package("Pkg")
Pkg [44cfe95a-1eb2-52ea-b672-e2afdf69b78f]
julia> Base.locate_package(pkg)
"/path/to/julia/stdlib/v1.11/Pkg/src/Pkg.jl"Base.require — Functionrequire(into::Module, module::Symbol)Cette fonction fait partie de l'implémentation de using / import, si un module n'est pas déjà défini dans Main. Elle peut également être appelée directement pour forcer le rechargement d'un module, peu importe s'il a été chargé auparavant (par exemple, lors du développement interactif de bibliothèques).
Charge un fichier source, dans le contexte du module Main, sur chaque nœud actif, en recherchant des emplacements standards pour les fichiers. require est considérée comme une opération de haut niveau, donc elle définit le chemin include actuel mais ne l'utilise pas pour rechercher des fichiers (voir l'aide pour include). Cette fonction est généralement utilisée pour charger du code de bibliothèque, et est appelée implicitement par using pour charger des paquets.
Lors de la recherche de fichiers, require commence par chercher du code de paquet dans le tableau global LOAD_PATH. require est sensible à la casse sur toutes les plateformes, y compris celles avec des systèmes de fichiers insensibles à la casse comme macOS et Windows.
Pour plus de détails concernant le chargement de code, voir les sections du manuel sur modules et calcul parallèle.
Base.compilecache — FunctionBase.compilecache(module::PkgId)Crée un fichier de cache précompilé pour un module et toutes ses dépendances. Cela peut être utilisé pour réduire les temps de chargement des paquets. Les fichiers de cache sont stockés dans DEPOT_PATH[1]/compiled. Voir Module initialization and precompilation pour des notes importantes.
Base.isprecompiled — FunctionBase.isprecompiled(pkg::PkgId; ignore_loaded::Bool=false)Renvoie si un PkgId donné dans le projet actif est précompilé.
Par défaut, cette vérification observe la même approche que le chargement de code en ce qui concerne les différentes versions des dépendances actuellement chargées par rapport à ce qui est attendu. Pour ignorer les modules chargés et répondre comme si vous étiez dans une nouvelle session julia, spécifiez ignore_loaded=true.
Cette fonction nécessite au moins Julia 1.10.
Base.get_extension — Functionget_extension(parent::Module, extension::Symbol)Retourne le module pour extension de parent ou retourne nothing si l'extension n'est pas chargée.
Internals
Base.GC.gc — FunctionGC.gc([full=true])Effectuez la collecte des ordures. L'argument full détermine le type de collecte : une collecte complète (par défaut) parcourt tous les objets vivants (c'est-à-dire un marquage complet) et devrait récupérer de la mémoire de tous les objets inaccessibles. Une collecte incrémentielle ne récupère de la mémoire que des jeunes objets qui ne sont pas accessibles.
Le GC peut décider d'effectuer une collecte complète même si une collecte incrémentielle a été demandée.
Une utilisation excessive entraînera probablement une mauvaise performance.
Base.GC.enable — FunctionGC.enable(on::Bool)Contrôlez si la collecte des ordures est activée en utilisant un argument booléen (true pour activé, false pour désactivé). Retournez l'état précédent de la collecte des ordures.
Désactiver la collecte des ordures ne doit être utilisé qu'avec prudence, car cela peut entraîner une augmentation illimitée de l'utilisation de la mémoire.
Base.GC.@preserve — MacroGC.@preserve x1 x2 ... xn exprMarquez les objets x1, x2, ... comme étant en cours d'utilisation pendant l'évaluation de l'expression expr. Cela est uniquement requis dans le code non sécurisé où expr utilise implicitement de la mémoire ou d'autres ressources appartenant à l'un des x.
Utilisation implicite de x couvre toute utilisation indirecte de ressources logiquement possédées par x que le compilateur ne peut pas voir. Quelques exemples :
- Accéder à la mémoire d'un objet directement via un
Ptr - Passer un pointeur à
xàccall - Utiliser des ressources de
xqui seraient nettoyées dans le finaliseur.
@preserve ne devrait généralement pas avoir d'impact sur les performances dans des cas d'utilisation typiques où il prolonge brièvement la durée de vie de l'objet. Dans l'implémentation, @preserve a des effets tels que la protection des objets alloués dynamiquement contre la collecte des ordures.
Exemples
Lors du chargement à partir d'un pointeur avec unsafe_load, l'objet sous-jacent est utilisé implicitement, par exemple x est utilisé implicitement par unsafe_load(p) dans ce qui suit :
julia> let
x = Ref{Int}(101)
p = Base.unsafe_convert(Ptr{Int}, x)
GC.@preserve x unsafe_load(p)
end
101Lors du passage de pointeurs à ccall, l'objet pointé est utilisé implicitement et doit être préservé. (Notez cependant que vous devriez normalement passer x directement à ccall, ce qui compte comme une utilisation explicite.)
julia> let
x = "Hello"
p = pointer(x)
Int(GC.@preserve x @ccall strlen(p::Cstring)::Csize_t)
# Alternative préférée
Int(@ccall strlen(x::Cstring)::Csize_t)
end
5Base.GC.safepoint — FunctionGC.safepoint()Insère un point dans le programme où la collecte des ordures peut s'exécuter. Cela peut être utile dans de rares cas dans des programmes multi-threadés où certains threads allouent de la mémoire (et peuvent donc avoir besoin d'exécuter la collecte des ordures) mais d'autres threads effectuent uniquement des opérations simples (pas d'allocation, de changements de tâche ou d'E/S). Appeler cette fonction périodiquement dans des threads non allouants permet à la collecte des ordures de s'exécuter.
Cette fonction est disponible depuis Julia 1.4.
Base.GC.enable_logging — FunctionGC.enable_logging(on::Bool)Lorsqu'il est activé, imprime des statistiques sur chaque GC dans stderr.
Base.GC.logging_enabled — FunctionGC.logging_enabled()Renvoie si la journalisation du GC a été activée via GC.enable_logging.
Base.Meta.lower — Functionlower(m, x)Prend l'expression x et renvoie une expression équivalente sous forme abaissée pour l'exécution dans le module m. Voir aussi code_lowered.
Base.Meta.@lower — Macro@lower [m] xRetourne la forme abaissée de l'expression x dans le module m. Par défaut, m est le module dans lequel la macro est appelée. Voir aussi lower.
Base.Meta.parse — Methodparse(str, start; greedy=true, raise=true, depwarn=true, filename="none")Analyse la chaîne d'expression et retourne une expression (qui pourrait ensuite être passée à eval pour exécution). start est l'index de l'unité de code dans str du premier caractère à partir duquel commencer l'analyse (comme pour tous les index de chaîne, ce ne sont pas des indices de caractères). Si greedy est true (par défaut), parse essaiera de consommer autant d'entrée qu'il le peut ; sinon, il s'arrêtera dès qu'il a analysé une expression valide. Les expressions incomplètes mais autrement syntaxiquement valides retourneront Expr(:incomplete, "(message d'erreur)"). Si raise est true (par défaut), les erreurs de syntaxe autres que les expressions incomplètes lèveront une erreur. Si raise est false, parse retournera une expression qui lèvera une erreur lors de l'évaluation. Si depwarn est false, les avertissements de dépréciation seront supprimés. L'argument filename est utilisé pour afficher des diagnostics lorsqu'une erreur est levée.
julia> Meta.parse("(α, β) = 3, 5", 1) # début de la chaîne
(:((α, β) = (3, 5)), 16)
julia> Meta.parse("(α, β) = 3, 5", 1, greedy=false)
(:((α, β)), 9)
julia> Meta.parse("(α, β) = 3, 5", 16) # fin de la chaîne
(nothing, 16)
julia> Meta.parse("(α, β) = 3, 5", 11) # index de 3
(:((3, 5)), 16)
julia> Meta.parse("(α, β) = 3, 5", 11, greedy=false)
(3, 13)Base.Meta.parse — Methodparse(str; raise=true, depwarn=true, filename="none")Analyse la chaîne d'expression de manière gourmande, renvoyant une seule expression. Une erreur est levée s'il y a des caractères supplémentaires après la première expression. Si raise est true (par défaut), les erreurs de syntaxe lèveront une erreur ; sinon, parse renverra une expression qui lèvera une erreur lors de l'évaluation. Si depwarn est false, les avertissements de dépréciation seront supprimés. L'argument filename est utilisé pour afficher des diagnostics lorsqu'une erreur est levée.
julia> Meta.parse("x = 3")
:(x = 3)
julia> Meta.parse("1.0.2")
ERROR: ParseError:
# Error @ none:1:1
1.0.2
└──┘ ── constante numérique invalide
[...]
julia> Meta.parse("1.0.2"; raise = false)
:($(Expr(:error, "constante numérique invalide "1.0."")))
julia> Meta.parse("x = ")
:($(Expr(:incomplete, "incomplet : fin prématurée de l'entrée")))Base.Meta.ParseError — TypeParseError(msg)L'expression passée à la fonction parse n'a pas pu être interprétée comme une expression Julia valide.
Core.QuoteNode — TypeQuoteNodeUn morceau de code cité, qui ne prend pas en charge l'interpolation. Voir la section du manuel sur les QuoteNodes pour plus de détails.
Base.macroexpand — Functionmacroexpand(m::Module, x; recursive=true)Prenez l'expression x et renvoyez une expression équivalente avec tous les macros supprimés (développés) pour l'exécution dans le module m. Le mot-clé recursive contrôle si des niveaux plus profonds de macros imbriquées sont également développés. Cela est démontré dans l'exemple ci-dessous :
julia> module M
macro m1()
42
end
macro m2()
:(@m1())
end
end
M
julia> macroexpand(M, :(@m2()), recursive=true)
42
julia> macroexpand(M, :(@m2()), recursive=false)
:(#= REPL[16]:6 =# M.@m1)Base.@macroexpand — Macro@macroexpand [mod,] exRenvoie l'expression équivalente avec toutes les macros supprimées (développées). Si deux arguments sont fournis, le premier est le module à évaluer.
Il existe des différences entre @macroexpand et macroexpand.
- Alors que
macroexpandprend un argument clérecursive,@macroexpandest toujours récursif. Pour une version non récursive des macros, voir@macroexpand1. - Alors que
macroexpanda un argumentmoduleexplicite,@macroexpandse développe toujours par rapport au module dans lequel il est appelé.
Ceci est mieux illustré dans l'exemple suivant :
julia> module M
macro m()
1
end
function f()
(@macroexpand(@m),
macroexpand(M, :(@m)),
macroexpand(Main, :(@m))
)
end
end
M
julia> macro m()
2
end
@m (macro with 1 method)
julia> M.f()
(1, 1, 2)Avec @macroexpand, l'expression se développe là où @macroexpand apparaît dans le code (module M dans l'exemple). Avec macroexpand, l'expression se développe dans le module donné comme premier argument.
La forme à deux arguments nécessite au moins Julia 1.11.
Base.@macroexpand1 — Macro@macroexpand1 [mod,] exVersion non récursive de @macroexpand.
Base.code_lowered — Functioncode_lowered(f, types; generated=true, debuginfo=:default)Renvoie un tableau des formes abaissées (IR) pour les méthodes correspondant à la fonction générique donnée et à la signature de type.
Si generated est false, les instances CodeInfo retournées correspondront aux implémentations de secours. Une erreur est levée si aucune implémentation de secours n'existe. Si generated est true, ces instances CodeInfo correspondront aux corps de méthode obtenus en développant les générateurs.
Le mot-clé debuginfo contrôle la quantité de métadonnées de code présentes dans la sortie.
Notez qu'une erreur sera levée si types ne sont pas des types de feuille lorsque generated est true et que l'une des méthodes correspondantes est une méthode @generated.
Base.code_typed — Functioncode_typed(f, types; kw...)Renvoie un tableau de la forme abaissée (IR) inférée par type pour les méthodes correspondant à la fonction générique donnée et à la signature de type.
Arguments Clés
optimize::Bool = true: optionnel, contrôle si des optimisations supplémentaires, telles que l'inlining, sont également appliquées.debuginfo::Symbol = :default: optionnel, contrôle la quantité de métadonnées de code présentes dans la sortie, les options possibles sont:sourceou:none.
Arguments Clés Internes
Cette section doit être considérée comme interne, et est uniquement destinée à ceux qui comprennent les internals du compilateur Julia.
world::UInt = Base.get_world_counter(): optionnel, contrôle l'âge du monde à utiliser lors de la recherche de méthodes, utilise l'âge du monde actuel si non spécifié.interp::Core.Compiler.AbstractInterpreter = Core.Compiler.NativeInterpreter(world): optionnel, contrôle l'interpréteur abstrait à utiliser, utilise l'interpréteur natif si non spécifié.
Exemples
On peut mettre les types d'arguments dans un tuple pour obtenir le code_typed correspondant.
julia> code_typed(+, (Float64, Float64))
1-element Vector{Any}:
CodeInfo(
1 ─ %1 = Base.add_float(x, y)::Float64
└── return %1
) => Float64Base.precompile — Functionprecompile(f, argtypes::Tuple{Vararg{Any}})Compile la fonction donnée f pour le tuple d'arguments (de types) argtypes, mais ne l'exécute pas.
precompile(f, argtypes::Tuple{Vararg{Any}}, m::Method)Précompiler une méthode spécifique pour les types d'arguments donnés. Cela peut être utilisé pour précompiler une méthode différente de celle qui serait normalement choisie par le dispatch, imitant ainsi invoke.
Base.jit_total_bytes — FunctionBase.jit_total_bytes()Renvoie le montant total (en octets) alloué par le compilateur à la volée pour, par exemple, le code natif et les données.
Meta
Base.Meta.quot — FunctionMeta.quot(ex)::ExprCiter l'expression ex pour produire une expression avec la tête quote. Cela peut par exemple être utilisé pour représenter des objets de type Expr dans l'AST. Voir aussi la section du manuel sur QuoteNode.
Exemples
julia> eval(Meta.quot(:x))
:x
julia> dump(Meta.quot(:x))
Expr
head: Symbol quote
args: Array{Any}((1,))
1: Symbol x
julia> eval(Meta.quot(:(1+2)))
:(1 + 2)Base.isexpr — FunctionMeta.isexpr(ex, head[, n])::BoolRetourne true si ex est un Expr avec le type donné head et éventuellement que la liste des arguments a une longueur de n. head peut être un Symbol ou une collection de Symbols. Par exemple, pour vérifier qu'un macro a reçu une expression d'appel de fonction, vous pourriez utiliser isexpr(ex, :call).
Exemples
julia> ex = :(f(x))
:(f(x))
julia> Meta.isexpr(ex, :block)
false
julia> Meta.isexpr(ex, :call)
true
julia> Meta.isexpr(ex, [:block, :call]) # plusieurs têtes possibles
true
julia> Meta.isexpr(ex, :call, 1)
false
julia> Meta.isexpr(ex, :call, 2)
trueBase.isidentifier — Function isidentifier(s) -> BoolRetourne si le symbole ou la chaîne s contient des caractères qui sont analysés comme un identifiant ordinaire valide (pas un opérateur binaire/uniaire) dans le code Julia ; voir aussi Base.isoperator.
En interne, Julia permet toute séquence de caractères dans un Symbol (sauf les \0), et les macros utilisent automatiquement des noms de variables contenant # afin d'éviter les collisions de noms avec le code environnant. Pour que le parseur reconnaisse une variable, il utilise un ensemble limité de caractères (grandement étendu par Unicode). isidentifier() permet de vérifier directement auprès du parseur si un symbole contient des caractères valides.
Exemples
julia> Meta.isidentifier(:x), Meta.isidentifier("1x")
(true, false)Base.isoperator — Functionisoperator(s::Symbol)Retourne true si le symbole peut être utilisé comme un opérateur, false sinon.
Exemples
julia> Meta.isoperator(:+), Meta.isoperator(:f)
(true, false)Base.isunaryoperator — Functionisunaryoperator(s::Symbol)Renvoie true si le symbole peut être utilisé comme un opérateur unaire (préfixe), false sinon.
Exemples
julia> Meta.isunaryoperator(:-), Meta.isunaryoperator(:√), Meta.isunaryoperator(:f)
(true, true, false)Base.isbinaryoperator — Functionisbinaryoperator(s::Symbol)Retourne true si le symbole peut être utilisé comme un opérateur binaire (infixe), false sinon.
Exemples
julia> Meta.isbinaryoperator(:-), Meta.isbinaryoperator(:√), Meta.isbinaryoperator(:f)
(true, false, false)Base.Meta.show_sexpr — FunctionMeta.show_sexpr([io::IO,], ex)Afficher l'expression ex sous forme d'une S-expression de style lisp.
Exemples
julia> Meta.show_sexpr(:(f(x, g(y,z))))
(:call, :f, :x, (:call, :g, :y, :z))