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 Module pour importer le module, et Module.fn(x) pour utiliser les fonctions.
  • Alternativement, using Module importera toutes les fonctions exportées de Module dans 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.exitFunction
exit(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.

source
Base.atexitFunction
atexit(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().

Julia 1.9

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.

source
Base.isinteractiveFunction
isinteractive() -> Bool

Déterminez si Julia s'exécute dans une session interactive.

source
Base.summarysizeFunction
Base.summarysize(obj; exclude=Union{...}, chargeall=Union{...}) -> Int

Calcule 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)))
8
source
Base.__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.

source
Base.includeFunction
Base.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

Julia 1.5 est requise pour passer l'argument mapexpr.

source
includeFunction
include([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

Julia 1.5 est requise pour passer l'argument mapexpr.

source
Base.include_stringFunction
include_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

Julia 1.5 est requis pour passer l'argument mapexpr.

source
Base.include_dependencyFunction
include_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.

Julia 1.11

L'argument clé track_content nécessite au moins Julia 1.11. Une erreur est maintenant lancée si path n'est pas lisible.

source
__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
end
source
Base.whichMethod
which(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.

source
Base.methodsFunction
methods(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.

Julia 1.4

Au moins Julia 1.4 est requis pour spécifier un module.

Voir aussi : which, @which et methodswith.

source
Base.@showMacro
@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.5
source
Base.MainInclude.ansConstant
ans

Une variable faisant référence à la dernière valeur calculée, importée automatiquement dans l'invite interactive.

source
Base.MainInclude.errConstant
err

Une 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.

source
Base.set_active_projectFunction
set_active_project(projfile::Union{AbstractString,Nothing})

Définissez le fichier Project.toml actif sur projfile. Voir aussi Base.active_project.

Julia 1.8

Cette fonction nécessite au moins Julia 1.8.

source

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.

moduleKeyword
module

module 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)")
end
source
exportKeyword
export

export 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.

source
publicKeyword
public

public 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.

Julia 1.11

Le mot-clé public a été ajouté dans Julia 1.11. Avant cela, la notion de publicité était moins explicite.

source
importKeyword
import

import 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.

source
usingKeyword
using

using 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.

Note

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.

source
asKeyword
as

as 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.

source
baremoduleKeyword
baremodule

baremodule 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

...

end

est équivalent à

baremodule Mod

using Base

eval(x) = Core.eval(Mod, x)
include(p) = Base.include(Mod, p)

...

end
source
functionKeyword
fonction

Les fonctions sont définies avec le mot-clé function :

function add(a, b)
    return a + b
end

Ou la notation courte :

add(a, b) = a + b

L'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.

source
macroKeyword
macro

macro 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 friend
source
returnKeyword
return

return 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"
end

En 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
end

Dans 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.

source
doKeyword
do

Créez une fonction anonyme et passez-la comme premier argument à un appel de fonction. Par exemple :

map(1:10) do x
    2x
end

est équivalent à map(x->2x, 1:10).

Utilisez plusieurs arguments comme ceci :

map(1:10, 11:20) do x, y
    x + y
end
source
beginKeyword
begin

begin...end désigne un bloc de code.

begin
    println("Hello, ")
    println("World!")
end

En 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.

Julia 1.4

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
 2
source
endKeyword
fin

fin 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
 4
source
letKeyword
let

Les 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
end

Les 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
 3

Cependant, 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
 3

Toutes 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
 3
source
ifKeyword
if/elseif/else

if/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")
end

Si 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 context
source
forKeyword
pour

pour 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
0
source
whileKeyword
while

Les 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
4
source
breakKeyword
break

Sortir 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
5
source
continueKeyword
continue

Sauter le reste de l'itération actuelle de la boucle.

Exemples

julia> for i = 1:6
           iseven(i) && continue
           println(i)
       end
1
3
5
source
tryKeyword
try/catch

Une 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."
end

ou, 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."
end

La 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.

source
finallyKeyword
finalement

Exé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)
end

Lorsque 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.

source
quoteKeyword
quote

quote 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
end

Contrairement 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.

source
localKeyword
local

local 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)
0
source
globalKeyword
global

global 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
6
source
outerKeyword
pour outer

Ré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()
0
julia> function f()
           i = 0
           for outer i = 1:3
               # vide
           end
           return i
       end;

julia> f()
3
julia> i = 0 # variable globale
       for outer i = 1:3
       end
ERREUR: syntaxe : aucune déclaration de variable locale externe n'existe pour "for outer"
[...]
source
constKeyword
const

const 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 = 5

Plusieurs variables peuvent être déclarées dans un seul const :

const y, z = 7, 11

Notez 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.

source
structKeyword
struct

Le type le plus couramment utilisé en Julia est un struct, spécifié par un nom et un ensemble de champs.

struct Point
    x
    y
end

Les champs peuvent avoir des restrictions de type, qui peuvent être paramétrées :

struct Point{X}
    x::X
    y::Float64
end

Un struct peut également déclarer un super type abstrait via la syntaxe <: :

struct Point <: AbstractPoint
    x
    y
end

Les 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.

source
mutable structKeyword
mutable struct

mutable 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
end
Julia 1.8

Le 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.

source
Base.@kwdefMacro
@kwdef typedef

Ceci 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.

Julia 1.1

Base.@kwdef pour les structs paramétriques, et les structs avec des supertypes nécessite au moins Julia 1.1.

Julia 1.9

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:
[...]
source
abstract typeKeyword
type abstrait

type 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 fin

Nombre n'a pas de supertype, tandis que Réel est un sous-type abstrait de Nombre.

source
primitive typeKeyword
type primitif

type 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 fin

Le 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.

source
whereKeyword

Le mot-clé 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<:Real

Il existe également une syntaxe concise pour les expressions imbriquées. Par exemple, ceci :

Pair{T, S} où S<:Array{T} où T<:Number

peut ê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, ...}.

source
...Keyword
L'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

source
;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
source
=Keyword
=

= est l'opérateur d'assignation.

  • Pour la variable a et l'expression b, a = b fait que a fait référence à la valeur de b.
  • Pour les fonctions f(x), f(x) = x définit une nouvelle constante de fonction f, ou ajoute une nouvelle méthode à f si f est déjà défini ; cette utilisation est équivalente à function f(x); x; end.
  • a[i] = v appelle setindex!(a,v,i).
  • a.b = c appelle setproperty!(a,:b,c).
  • À l'intérieur d'un appel de fonction, f(a=b) passe b comme la valeur de l'argument clé a.
  • À l'intérieur de parenthèses avec des virgules, (a=1,) construit un NamedTuple.

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
source
?:Keyword
a ? b : c

Forme 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"
source

Standard Modules

MainModule
Principal

Principal 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__
Principal
source
CoreModule
Noyau

Noyau 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.

source
BaseModule
Base

La 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.

source

Base Submodules

Base.DocsModule
Docs

Le 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.

source
Base.MetaModule

Fonctions de commodité pour la métaprogrammation.

source
Base.StackTracesModule

Outils pour collecter et manipuler les traces de pile. Principalement utilisés pour construire des erreurs.

source
Base.SysModule

Fournir des méthodes pour récupérer des informations sur le matériel et le système d'exploitation.

source
Base.GCModule
Base.GC

Module avec des utilitaires de collecte des déchets.

source

All Objects

Core.:===Function
===(x,y) -> Bool
≡(x,y) -> Bool

Dé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
true
source
Core.isaFunction
isa(x, type) -> Bool

Dé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
true
source
Base.isequalFunction
isequal(x, y) -> Bool

Semblable à ==, 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)
true
source
isequal(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.

source
Base.islessFunction
isless(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, alors isless(y, x) et isequal(x, y) le sont aussi, et exactement l'un de ces trois renvoie true.
  • La relation définie par isless est transitive, c'est-à-dire que isless(x, y) && isless(y, z) implique isless(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")
false
source
Base.isunorderedFunction
isunordered(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.

Julia 1.7

Cette fonction nécessite Julia 1.7 ou une version ultérieure.

source
Base.ifelseFunction
ifelse(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)
2
source
Core.typeassertFunction
typeassert(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:
[...]
source
Core.typeofFunction
typeof(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})
source
Core.tupleFunction
tuple(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, π)
source
Base.ntupleFunction
ntuple(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)
source
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)
source
Base.objectidFunction
objectid(x) -> UInt

Obtenez 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).

Voir aussi hash, IdDict.

source
Base.hashFunction
hash(x[, h::UInt]) -> UInt

Calculez 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
0xd42bad54a8575b16

Voir aussi : objectid, Dict, Set.

source
Base.finalizerFunction
finalizer(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))
end

Un 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
end
source
Base.finalizeFunction
finalize(x)

Exécute immédiatement les finaliseurs enregistrés pour l'objet x.

source
Base.copyFunction
copy(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.

Voir aussi copy!, copyto!, deepcopy.

source
Base.deepcopyFunction
deepcopy(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.

source
Base.getpropertyFunction
getproperty(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
1

On 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!.

source
Base.setproperty!Function
setproperty!(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).

Julia 1.8

setproperty! sur les modules nécessite au moins Julia 1.8.

Voir aussi setfield!, propertynames et getproperty.

source
Base.replaceproperty!Function
replaceproperty!(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!.

source
Base.swapproperty!Function
swapproperty!(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!.

source
Base.modifyproperty!Function
modifyproperty!(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!.

source
Base.setpropertyonce!Function
setpropertyonce!(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!.

Julia 1.11

Cette fonction nécessite Julia 1.11 ou une version ultérieure.

source
Base.propertynamesFunction
propertynames(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.

source
Base.haspropertyFunction
hasproperty(x, s::Symbol)

Renvoie un booléen indiquant si l'objet x a s comme l'une de ses propres propriétés.

Julia 1.2

Cette fonction nécessite au moins Julia 1.2.

Voir aussi : propertynames, hasfield.

source
Core.getfieldFunction
getfield(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)
1
source
Core.setfield!Function
setfield!(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 changed
source
Core.modifyfield!Function
modifyfield!(value, name::Symbol, op, x, [order::Symbol]) -> Pair
modifyfield!(value, i::Int, op, x, [order::Symbol]) -> Pair

Effectuer 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 => z

Si 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.

Julia 1.7

Cette fonction nécessite Julia 1.7 ou une version ultérieure.

source
Core.replacefield!Function
replacefield!(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.

Julia 1.7

Cette fonction nécessite Julia 1.7 ou une version ultérieure.

source
Core.swapfield!Function
swapfield!(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 y
Julia 1.7

Cette fonction nécessite Julia 1.7 ou une version ultérieure.

source
Core.setfieldonce!Function
setfieldonce!(value, name::Union{Int,Symbol}, desired,
              [success_order::Symbol, [fail_order::Symbol=success_order]) -> success::Bool

Effectuer 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 ok
Julia 1.11

Cette fonction nécessite Julia 1.11 ou une version ultérieure.

source
Core.isdefinedFunction
isdefined(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)
false
source
Base.@isdefinedMacro
@isdefined s -> Bool

Teste 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
true
source
Base.convertFunction
convert(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.333333333333333314829616256247390992939472198486328125

Si 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
true

Voir aussi : round, trunc, oftype, reinterpret.

source
Base.promoteFunction
promote(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)
Any
source
Base.oftypeFunction
oftype(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.0
source
Base.widenFunction
widen(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.5
source
Base.identityFunction
identity(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?"
source
Core.WeakRefType
WeakRef(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)
source

Properties of Types

Type relations

Base.supertypeFunction
supertype(T::DataType)

Retourne le supertype du DataType T.

Exemples

julia> supertype(Int32)
Signed
source
Core.TypeType
Core.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})
true
source
Core.DataTypeType
DataType <: 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)
DataType
source
Core.:<: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}
false
source
Base.:>:Function
>:(T1, T2)

Opérateur de supertype, équivalent à T2 <: T1.

source
Base.typejoinFunction
typejoin(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)
Number
source
Base.typeintersectFunction
typeintersect(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).

source
Base.promote_typeFunction
promote_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)
UInt16
Ne surchargez pas cela directement

Pour 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é.

source
Base.promote_ruleFunction
promote_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.

source
Base.promote_typejoinFunction
promote_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)
Float64
source
Base.isdispatchtupleFunction
isdispatchtuple(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.

source

Declared structure

Base.ismutableFunction
ismutable(v) -> Bool

Retourne 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.

Note

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])
true
Julia 1.5

Cette fonction nécessite au moins Julia 1.5.

source
Base.isimmutableFunction
isimmutable(v) -> Bool
Warning

Envisagez 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])
false
source
Base.ismutabletypeFunction
ismutabletype(T) -> Bool

Dé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.

Julia 1.7

Cette fonction nécessite au moins Julia 1.7.

source
Base.isabstracttypeFunction
isabstracttype(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)
false
source
Base.isprimitivetypeFunction
isprimitivetype(T) -> Bool

Dé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.

source
Base.issingletontypeFunction
Base.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.

source
Base.isstructtypeFunction
isstructtype(T) -> Bool

Dé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.

source
Base.nameofMethod
nameof(t::DataType) -> Symbol

Obtenez 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)
:S
source
Base.fieldnamesFunction
fieldnames(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)
source
Base.fieldnameFunction
fieldname(x::DataType, i::Integer)

Obtenez le nom du champ i d'un DataType.

Exemples

julia> fieldname(Rational, 1)
:num

julia> fieldname(Rational, 2)
:den
source
Core.fieldtypeFunction
fieldtype(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)
String
source
Base.fieldtypesFunction
fieldtypes(T::Type)

Les types déclarés de tous les champs dans un DataType composite T sous forme de tuple.

Julia 1.1

Cette fonction nécessite au moins Julia 1.1.

Exemples

julia> struct Foo
           x::Int64
           y::String
       end

julia> fieldtypes(Foo)
(Int64, String)
source
Base.fieldcountFunction
fieldcount(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.

source
Base.hasfieldFunction
hasfield(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.

Julia 1.2

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)
false
source
Core.nfieldsFunction
nfields(x) -> Int

Obtenez 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)
1

Dans 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.

source
Base.isconstFunction
isconst(m::Module, s::Symbol) -> Bool

Déterminez si une variable globale est déclarée const dans un module donné m.

source
isconst(t::DataType, s::Union{Int,Symbol}) -> Bool

Déterminez si un champ s est déclaré const dans un type donné t.

source
Base.isfieldatomicFunction
isfieldatomic(t::DataType, s::Union{Int,Symbol}) -> Bool

Déterminez si un champ s est déclaré @atomic dans un type donné t.

source

Memory layout

Base.sizeofMethod
sizeof(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
9

Si 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:
[...]
source
Base.isconcretetypeFunction
isconcretetype(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})
false
source
Base.isbitstypeFunction
isbitstype(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)
false
source
Base.fieldoffsetFunction
fieldoffset(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)
source
Base.datatype_alignmentFunction
Base.datatype_alignment(dt::DataType) -> Int

Alignement 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.

source
Base.datatype_haspaddingFunction
Base.datatype_haspadding(dt::DataType) -> Bool

Renvoie 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.

source
Base.datatype_pointerfreeFunction
Base.datatype_pointerfree(dt::DataType) -> Bool

Renvoie 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.

source

Special values

Base.typeminFunction
typemin(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.4028235f38
source
Base.typemaxFunction
typemax(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.4028235f38
source
Base.floatminFunction
floatmin(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-308
source
Base.floatmaxFunction
floatmax(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)
Inf
source
Base.maxintfloatFunction
maxintfloat(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)).

source
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).

source
Base.epsMethod
eps(::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.0
source
Base.epsMethod
eps(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.7976931348623157e308
source
Base.instancesFunction
instances(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)
source

Special Types

Core.AnyType
Any::DataType

Any 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.

source
Core.UnionType
Union{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
false

Aide É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.

source
Union{}Keyword
Union{}

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{})
false
source
Core.UnionAllType
UnionAll

Une 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})
DataType
source
Core.TupleType
Tuple{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.

source
Core.NTupleType
NTuple{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})
true

Voir aussi ntuple.

source
Core.NamedTupleType
NamedTuple

Les 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.

Note

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 => 2

De 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,)
Julia 1.5

Les noms implicites provenant des identifiants et des expressions à point sont disponibles depuis Julia 1.5.

Julia 1.7

L'utilisation des méthodes getindex avec plusieurs Symbols est disponible depuis Julia 1.7.

source
Base.@NamedTupleMacro
@NamedTuple{key1::Type1, key2::Type2, ...}
@NamedTuple begin key1::Type1; key2::Type2; ...; end

Cette 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}
Julia 1.5

Cette macro est disponible depuis Julia 1.5.

source
Base.@KwargsMacro
@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]:1
Julia 1.10

Ce macro est disponible depuis Julia 1.10.

source
Base.ValType
Val(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"
source
Core.VarargConstant
Vararg{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)
false
source
Base.SomeType
Some{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.

source
Base.somethingFunction
something(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 present
source
Base.@somethingMacro
@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
true
Julia 1.7

Ce macro est disponible depuis Julia 1.7.

source
Base.Enums.@enumMacro
@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 = 1

Les valeurs peuvent également être spécifiées à l'intérieur d'un bloc begin, par exemple

@enum EnumName begin
    value1
    value2
end

BaseType, 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)
:apple
source
Core.ExprType
Expr(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 c
source
Core.SymbolType
Symbole

Le 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)
42

Les 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.

source
Core.SymbolMethod
Symbol(x...) -> Symbol

Cré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)
:day4
source
Core.ModuleType
Module

Un 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.

source

Generic Functions

Core.FunctionType
Fonction

Type 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
true
source
Base.hasmethodFunction
hasmethod(f, t::Type{<:Tuple}[, kwnames]; world=get_world_counter()) -> Bool

Dé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.

Julia 1.2

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
true
source
Core.applicableFunction
applicable(f, args...) -> Bool

Dé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)
true
source
Base.isambiguousFunction
Base.isambiguous(m1, m2; ambiguous_bottom=false) -> Bool

Dé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)
false
source
Core.invokeFunction
invoke(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)
Integer
source
Base.@invokeMacro
@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).f se développe en invoke(getproperty, Tuple{X,Symbol}, x, :f)
  • @invoke (x::X).f = v::V se développe en invoke(setproperty!, Tuple{X,Symbol,V}, x, :f, v)
  • @invoke (xs::Xs)[i::I] se développe en invoke(getindex, Tuple{Xs,I}, xs, i)
  • @invoke (xs::Xs)[i::I] = v::V se développe en invoke(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))
Julia 1.7

Ce macro nécessite Julia 1.7 ou une version ultérieure.

Julia 1.9

Ce macro est exporté à partir de Julia 1.9.

Julia 1.10

La syntaxe supplémentaire est prise en charge à partir de Julia 1.10.

source
Base.invokelatestFunction
invokelatest(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.)

Julia 1.9

Avant Julia 1.9, cette fonction n'était pas exportée et était appelée comme Base.invokelatest.

source
Base.@invokelatestMacro
@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.f se développe en Base.invokelatest(getproperty, x, :f)
  • @invokelatest x.f = v se développe en Base.invokelatest(setproperty!, x, :f, v)
  • @invokelatest xs[i] se développe en Base.invokelatest(getindex, xs, i)
  • @invokelatest xs[i] = v se développe en Base.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))
Julia 1.7

Cette macro nécessite Julia 1.7 ou une version ultérieure.

Julia 1.9

Avant Julia 1.9, cette macro n'était pas exportée et était appelée comme Base.@invokelatest.

Julia 1.10

La syntaxe supplémentaire x.f et xs[i] nécessite Julia 1.10.

source
newKeyword
new, 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.

source
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
14
source
Base.:∘Function
f ∘ g

Composer 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.

Julia 1.4

La composition de plusieurs fonctions nécessite au moins Julia 1.4.

Julia 1.5

La composition d'une seule fonction ∘(f) nécessite au moins Julia 1.5.

Julia 1.7

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.0

Voir aussi ComposedFunction, !f::Function.

source
Base.ComposedFunctionType
ComposedFunction{Outer,Inner} <: Function

Repré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
true
Julia 1.6

ComposedFunction nécessite au moins Julia 1.6. Dans les versions antérieures, renvoie une fonction anonyme à la place.

Voir aussi .

source
Base.splatFunction
splat(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))
6
source
Base.Fix1Type
Fix1(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.

source
Base.Fix2Type
Fix2(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).

source

Syntax

Core.evalFunction
Core.eval(m::Module, expr)

Évalue une expression dans le module donné et renvoie le résultat.

source
evalFunction
eval(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.

source
Base.@evalMacro
@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.

source
Base.evalfileFunction
evalfile(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")
source
Base.escFunction
esc(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.

source
Base.@inboundsMacro
@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
end
Avertissement

L'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.

source
Base.@boundscheckMacro
@boundscheck(blk)

Annotates the expression blk as a bounds checking block, allowing it to be elided by @inbounds.

Note

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]"
Warning

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.

source
Base.@propagate_inboundsMacro
@propagate_inbounds

Indique au compilateur d'inliner une fonction tout en conservant le contexte inbounds de l'appelant.

source
Base.@inlineMacro
@inline

Donnez 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
    ...
end
Julia 1.8

L'utilisation dans un corps de fonction nécessite au moins Julia 1.8.


@inline block

Donnez 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(...)
Note

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é
end
Note

Lorsqu'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
end
Warning

Bien 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.

Julia 1.8

L'annotation de site d'appel nécessite au moins Julia 1.8.

source
Base.@noinlineMacro
@noinline

Donnez 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
    ...
end
Julia 1.8

L'utilisation dans un corps de fonction nécessite au moins Julia 1.8.


@noinline block

Donnez 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(...)
Note

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é
end
Note

Lorsque 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
end
Julia 1.8

L'annotation de site d'appel nécessite au moins Julia 1.8.


Note

Si la fonction est triviale (par exemple, retournant une constante), elle pourrait quand même être inlinée.

source
Base.@nospecializeMacro
@nospecialize

Appliqué à 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
Note

@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
) => Float64

Ici, 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.

source
Base.@nospecializeinferMacro
Base.@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
) => Any

Dans 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é.

Julia 1.10

L'utilisation de Base.@nospecializeinfer nécessite la version 1.10 de Julia.

source
Base.@constpropMacro
Base.@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 type Bool ou Symbol ou 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
    ...
end
Julia 1.10

L'utilisation dans le corps d'une fonction nécessite au moins Julia 1.10.

source
Base.gensymFunction
gensym([tag])

Génère un symbole qui ne conflictera pas avec d'autres noms de variables (dans le même module).

source
Base.@gensymMacro
@gensym

Génère un symbole gensym pour une variable. Par exemple, @gensym x y est transformé en x = gensym("x"); y = gensym("y").

source
var"name"Keyword
var

La 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.

Julia 1.3

Cette syntaxe nécessite au moins Julia 1.3.

source
Base.@gotoMacro
@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.

source
Base.@labelMacro
@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.

source
Base.SimdLoop.@simdMacro
@simd

Annoter une boucle for pour permettre au compilateur de prendre des libertés supplémentaires pour permettre le réarrangement des boucles

Avertissement

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, @inbounds est 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 fonction ifelse au 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.
Note

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.
source
Base.@pollyMacro
@polly

Indique au compilateur d'appliquer l'optimiseur polyédrique Polly à une fonction.

source
Base.@generatedMacro
@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"
source
Base.@assume_effectsMacro
Base.@assume_effects réglage... [ex]

Surchargez la modélisation des effets du compilateur. Cette macro peut être utilisée dans plusieurs contextes :

  1. Immédiatement avant une définition de méthode, pour remplacer la modélisation des effets de la méthode appliquée.
  2. Dans le corps d'une fonction sans arguments, pour remplacer la modélisation des effets de la méthode englobante.
  3. 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}
Julia 1.8

L'utilisation de Base.@assume_effects nécessite la version Julia 1.8.

Julia 1.10

L'utilisation dans le corps d'une fonction nécessite au moins Julia 1.10.

Julia 1.11

L'annotation de bloc de code nécessite au moins Julia 1.11.

Warning

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.
Note

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.

Note

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é.

Note

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).

Note

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.

Note

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).

Note

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.

Note

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.

Note

Cette assertion :terminates_globally couvre toutes les autres méthodes appelées par la méthode annotée.

Note

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.

Note

: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.

Note

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.

Note

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.

Note

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.

Note

Ci-dessous se trouve une liste incomplète d'exemples qui invalident cette hypothèse :

  • une référence globale ou un appel getglobal pour 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
Note

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.

Note

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
Note

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.

Note

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
Warning

: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.

source

Managing deprecations

Base.@deprecateMacro
@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().

Julia 1.5

À 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.

Julia 1.9

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:94

dé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).

source
Base.depwarnFunction
Base.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
end
source

Missing Values

Base.coalesceFunction
coalesce(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)
missing
source
Base.@coalesceMacro
@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
[...]
Julia 1.7

Ce macro est disponible depuis Julia 1.7.

source
Base.skipmissingFunction
skipmissing(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
 2
source
Base.nonmissingtypeFunction
nonmissingtype(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)
Any
Julia 1.3

Cette fonction est exportée depuis Julia 1.3.

source

System

Base.runFunction
run(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.

source
Base.devnullConstant
devnull

Utilisé 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))
source
Base.successFunction
success(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é.

source
Base.process_runningFunction
process_running(p::Process)

Déterminez si un processus est actuellement en cours d'exécution.

source
Base.killMethod
kill(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).

source
Base.Sys.set_process_titleFunction
Sys.set_process_title(title::AbstractString)

Définir le titre du processus. N'a aucun effet sur certains systèmes d'exploitation.

source
Base.Sys.get_process_titleFunction
Sys.get_process_title()

Obtenez le titre du processus. Sur certains systèmes, cela renverra toujours une chaîne vide.

source
Base.ignorestatusFunction
ignorestatus(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.

source
Base.detachFunction
detach(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.

source
Base.CmdType
Cmd(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 : Si true (par défaut false), alors le Cmd ne lancera pas d'erreur si le code de retour est non nul.
  • detach::Bool : Si true (par défaut false), alors le Cmd sera exécuté dans un nouveau groupe de processus, lui permettant de survivre au processus julia et de ne pas recevoir Ctrl-C.
  • windows_verbatim::Bool : Si true (par défaut false), alors sous Windows, le Cmd enverra 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=true est 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 : Si true (par défaut false), alors sous Windows, aucune nouvelle fenêtre de console n'est affichée lorsque le Cmd est 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 du Cmd. env est 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, initialisez env avec copy(ENV) puis définissez env["var"]=val selon vos besoins. Pour ajouter à un bloc d'environnement dans un objet Cmd sans remplacer tous les éléments, utilisez addenv() qui renverra un objet Cmd avec 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)
source
Base.setenvFunction
setenv(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é).

Voir aussi Cmd, addenv, ENV, pwd.

source
Base.addenvFunction
addenv(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.

Voir aussi Cmd, setenv, ENV.

Julia 1.6

Cette fonction nécessite Julia 1.6 ou une version ultérieure.

source
Base.withenvFunction
withenv(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é.

Warning

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.

source
Base.setcpuaffinityFunction
setcpuaffinity(original_command::Cmd, cpus) -> command::Cmd

Dé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é.

Julia 1.8

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: 13

Notez 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
0x13
source
Base.pipelineMethod
pipeline(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`))
source
Base.pipelineMethod
pipeline(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))
source
Base.Libc.getpidFunction
getpid() -> Int32

Obtenez l'ID de processus de Julia.

source
getpid(process) -> Int32

Obtenez l'ID du processus enfant, s'il existe encore.

Julia 1.1

Cette fonction nécessite au moins Julia 1.1.

source
Base.Libc.timeMethod
time() -> Float64

Obtenez l'heure système en secondes depuis l'époque, avec une résolution assez élevée (typiquement, en microsecondes).

source
Base.time_nsFunction
time_ns() -> UInt64

Obtenez le temps en nanosecondes. Le temps correspondant à 0 est indéfini et se répète tous les 5,8 ans.

source
Base.@timeMacro
@time expr
@time "description" expr

Une 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.

Note

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.

Julia 1.8

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

Julia 1.11

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)
source
Base.@showtimeMacro
@showtime expr

Comme @time mais imprime également l'expression évaluée pour référence.

Julia 1.8

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)
source
Base.@timevMacro
@timev expr
@timev "description" expr

Ceci 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.

Julia 1.8

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:       1
source
Base.@timedMacro
@timed

Une 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
Julia 1.5

Le type de retour de cette macro a été changé de Tuple à NamedTuple dans Julia 1.5.

Julia 1.11

Les champs lock_conflicts, compile_time et recompile_time ont été ajoutés dans Julia 1.11.

source
Base.@elapsedMacro
@elapsed

Une 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.301391426
source
Base.@allocatedMacro
@allocated

Une 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)
8000080
source
Base.@allocationsMacro
@allocations

Une 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)
2
Julia 1.9

Cette macro a été ajoutée dans Julia 1.9.

source
Base.@lock_conflictsMacro
@lock_conflicts

Une 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
5
Julia 1.11

Cette macro a été ajoutée dans Julia 1.11.

source
Base.EnvDictType
EnvDict() -> EnvDict

Un singleton de ce type fournit une interface de table de hachage aux variables d'environnement.

source
Base.ENVConstant
ENV

Ré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.)

Avertissement

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"

Voir aussi : withenv, addenv.

source
Base.Sys.STDLIBConstant
Sys.STDLIB::String

Une chaîne contenant le chemin complet vers le répertoire contenant les packages stdlib.

source
Base.Sys.isbsdFunction
Sys.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.

Note

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().

source
Base.Sys.isfreebsdFunction
Sys.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.

Note

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.

Julia 1.1

Cette fonction nécessite au moins Julia 1.1.

source
Base.Sys.isopenbsdFunction
Sys.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.

Note

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.

Julia 1.1

Cette fonction nécessite au moins Julia 1.1.

source
Base.Sys.isnetbsdFunction
Sys.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.

Note

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.

Julia 1.1

Cette fonction nécessite au moins Julia 1.1.

source
Base.Sys.isdragonflyFunction
Sys.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.

Note

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.

Julia 1.1

Cette fonction nécessite au moins Julia 1.1.

source
Base.Sys.windows_versionFunction
Sys.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.

source
Base.Sys.total_memoryFunction
Sys.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().

source
Base.Sys.free_physical_memoryFunction
Sys.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.

source
Base.Sys.total_physical_memoryFunction
Sys.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().

source
Base.Sys.uptimeFunction
Sys.uptime()

Obtient le temps de fonctionnement actuel du système en secondes.

source
Base.Sys.isjsvmFunction
Sys.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.

Julia 1.2

Cette fonction nécessite au moins Julia 1.2.

source
Base.Sys.loadavgFunction
Sys.loadavg()

Obtenez la moyenne de charge. Voir : https://en.wikipedia.org/wiki/Load_(computing).

source
Base.Sys.isexecutableFunction
isexecutable(path::String)

Retourne true si le path donné a des permissions d'exécution.

Note

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.

Note

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.

source
Base.Sys.isreadableFunction
isreadable(path::String)

Retourne true si les permissions d'accès pour le path donné permettent la lecture par l'utilisateur actuel.

Note

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.

Note

Actuellement, cette fonction n'interroge pas correctement les ACL du système de fichiers sur Windows, elle peut donc renvoyer des résultats incorrects.

Julia 1.11

Cette fonction nécessite au moins Julia 1.11.

Voir aussi ispath, isexecutable, iswritable.

source
isreadable(io) -> Bool

Retourne 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")
source
Base.Sys.iswritableFunction
iswritable(path::String)

Retourne true si les permissions d'accès pour le path donné permettent l'écriture par l'utilisateur actuel.

Note

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.

Note

Actuellement, cette fonction n'interroge pas correctement les ACL du système de fichiers sur Windows, elle peut donc renvoyer des résultats incorrects.

Julia 1.11

Cette fonction nécessite au moins Julia 1.11.

Voir aussi ispath, isexecutable, isreadable.

source
iswritable(io) -> Bool

Retourne 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")
source
Base.Sys.usernameFunction
Sys.username() -> String

Renvoie 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")
Julia 1.11

Cette fonction nécessite au moins Julia 1.11.

Voir aussi homedir.

source
Base.@staticMacro
@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.

source

Versioning

Base.VersionNumberType
VersionNumber

Type 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::Integer
  • v.minor::Integer
  • v.patch::Integer
  • v.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"
false
source
Base.@v_strMacro
@v_str

Macro 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"
source

Errors

Base.errorFunction
error(message::AbstractString)

Lève une ErrorException avec le message donné.

source
error(msg...)

Lève une ErrorException avec un message construit par string(msg...).

source
Base.rethrowFunction
rethrow()

Relance l'exception actuelle depuis un bloc catch. L'exception relancée continuera sa propagation comme si elle n'avait pas été interceptée.

Note

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.

source
Base.backtraceFunction
backtrace()

Obtenez un objet backtrace pour le point de programme actuel.

source
Base.catch_backtraceFunction
catch_backtrace()

Obtenez la trace de la pile de l'exception actuelle, à utiliser dans les blocs catch.

source
Base.current_exceptionsFunction
current_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.

Julia 1.7

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.

source
Base.@assertMacro
@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.

Avertissement

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 ?"
source
Base.Experimental.register_error_hintFunction
Experimental.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 : fournir handler(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

       end

Alors 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 :
    ...
Julia 1.5

Les suggestions d'erreurs personnalisées sont disponibles depuis Julia 1.5.

Warning

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.

source
Base.Experimental.show_error_hintsFunction
Experimental.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.

Julia 1.5

Les indices d'erreur personnalisés sont disponibles depuis Julia 1.5.

Warning

Cette interface est expérimentale et sujette à des modifications ou à une suppression sans préavis.

source
Core.ArgumentErrorType
ArgumentError(msg)

Les arguments passés à une fonction sont invalides. msg est un message d'erreur descriptif.

source
Core.AssertionErrorType
AssertionError([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 vrai

AssertionError est généralement lancé par @assert. ```

source
Core.BoundsErrorType
BoundsError([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]
source
Base.CompositeExceptionType
CompositeException

Enveloppe 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).

source
Base.DimensionMismatchType
DimensionMismatch([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.

source
Core.DivideErrorType
DivideError()

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 :
[...]
source
Core.DomainErrorType
DomainError(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:
[...]
source
Base.EOFErrorType
EOFError()

Aucune donnée supplémentaire n'était disponible à lire à partir d'un fichier ou d'un flux.

source
Core.ErrorExceptionType
ErrorException(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"
source
Core.InexactErrorType
InexactError(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:
[...]
source
Core.InterruptExceptionType
InterruptException()

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.jl

pour permettre à InterruptException d'être lancé par CTRL+C pendant l'exécution.

source
Base.KeyErrorType
KeyError(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.

source
Core.LoadErrorType
LoadError(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.

Julia 1.7

Les LoadErrors ne sont plus émis par @macroexpand, @macroexpand1 et macroexpand depuis Julia 1.7.

source
Core.MethodErrorType
MethodError(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.

source
Base.MissingExceptionType
MissingException(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.

source
Core.OutOfMemoryErrorType
OutOfMemoryError()

Une opération a alloué trop de mémoire pour que le système ou le ramasse-miettes puisse gérer correctement.

source
Core.OverflowErrorType
OverflowError(msg)

Le résultat d'une expression est trop grand pour le type spécifié et provoquera un débordement.

source
Base.ProcessFailedExceptionType
ProcessFailedException

Indique 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é).

source
Base.TaskFailedExceptionType
TaskFailedException

Cette exception est lancée par un appel à wait(t) lorsque la tâche t échoue. TaskFailedException enveloppe la tâche échouée t.

source
Core.StackOverflowErrorType
StackOverflowError()

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.

source
Base.SystemErrorType
SystemError(prefix::AbstractString, [errno::Int32])

Un appel système a échoué avec un code d'erreur (dans la variable globale errno).

source
Core.TypeErrorType
TypeError(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.

source
Core.UndefKeywordErrorType
UndefKeywordError(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]:1
source
Core.UndefRefErrorType
UndefRefError()

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:
[...]
source
Core.UndefVarErrorType
UndefVarError(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
1
source
Base.StringIndexErrorType
StringIndexError(str, i)

Une erreur s'est produite lors de la tentative d'accès à str à l'index i qui n'est pas valide.

source
Core.InitErrorType
InitError(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.

source
Base.retryFunction
retry(f;  delays=ExponentialBackOff(), check=nothing) -> Function

Renvoie 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.

Julia 1.2

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)
source
Base.ExponentialBackOffType
ExponentialBackOff(; 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.

source

Events

Base.TimerMethod
Timer(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
3
source
Base.TimerType
Timer(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.

Note

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.

Note

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.

source
Base.AsyncConditionType
AsyncCondition()

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.

source
Base.AsyncConditionMethod
AsyncCondition(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.

source

Reflection

Base.nameofMethod
nameof(m::Module) -> Symbol

Obtenez le nom d'un Module sous forme de Symbol.

Exemples

julia> nameof(Base.Broadcast)
:Broadcast
source
Base.parentmoduleFunction
parentmodule(m::Module) -> Module

Obtenez 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)
Base
source
parentmodule(t::DataType) -> Module

Dé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)
Foo
source
parentmodule(f::Function) -> Module

Déterminez le module contenant la (première) définition d'une fonction générique.

source
parentmodule(f::Function, types) -> Module

Déterminez le module contenant la première méthode d'une fonction générique f correspondant aux types spécifiés.

source
parentmodule(m::Method) -> Module

Renvoie le module dans lequel la méthode donnée m est définie.

Julia 1.9

Passer un Method comme argument nécessite Julia 1.9 ou une version ultérieure.

source
Base.pathofMethod
pathof(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.

source
Base.pkgdirMethod
pkgdir(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.

Julia 1.7

L'argument optionnel paths nécessite au moins Julia 1.7.

source
Base.pkgversionMethod
pkgversion(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.

Julia 1.9

Cette fonction a été introduite dans Julia 1.9.

source
Base.modulerootFunction
moduleroot(m::Module) -> Module

Trouvez 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.

source
__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
__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.

source
Base.@__MODULE__Macro
@__MODULE__ -> Module

Obtenez le Module de l'évaluation de niveau supérieur, qui est le Module à partir duquel le code est actuellement lu.

source
Base.@__FILE__Macro
@__FILE__ -> String

Dé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.

source
Base.@__DIR__Macro
@__DIR__ -> String

Macro 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/JuliaUser
source
Base.@__LINE__Macro
@__LINE__ -> Int

Dé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é.

source
Base.fullnameFunction
fullname(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,)
source
Base.namesFunction
names(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.

Note

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__.

source
Base.isexportedFunction
isexported(m::Module, s::Symbol) -> Bool

Renvoie si un symbole est exporté d'un module.

Voir aussi : ispublic, names

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)
false
source
Base.ispublicFunction
ispublic(m::Module, s::Symbol) -> Bool

Renvoie si un symbole est marqué comme public dans un module.

Les symboles exportés sont considérés comme publics.

Julia 1.11

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)
false
source
Base.nameofMethod
nameof(f::Function) -> Symbol

Obtenez 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.

source
Base.functionlocMethod
functionloc(f::Function, types)

Renvoie un tuple (nom_fichier, ligne) donnant l'emplacement d'une définition de Function générique.

source
Base.functionlocMethod
functionloc(m::Method)

Renvoie un tuple (nom_fichier, ligne) donnant l'emplacement d'une définition de Method.

source
Base.@localsMacro
@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.

Julia 1.1

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)
source
Core.getglobalFunction
getglobal(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.

Julia 1.9

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)
2
source
Core.setglobal!Function
setglobal!(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.

Julia 1.9

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
1
source
Core.modifyglobal!Function
modifyglobal!(module::Module, name::Symbol, op, x, [order::Symbol=:monotonic]) -> Pair

Effectuer atomiquement les opérations pour obtenir et définir un global après avoir appliqué la fonction op.

Julia 1.11

Cette fonction nécessite Julia 1.11 ou une version ultérieure.

Voir aussi modifyproperty! et setglobal!.

source
Core.swapglobal!Function
swapglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])

Effectuer atomiquement les opérations pour obtenir et définir simultanément un global.

Julia 1.11

Cette fonction nécessite Julia 1.11 ou une version ultérieure.

Voir aussi swapproperty! et setglobal!.

source
Core.setglobalonce!Function
setglobalonce!(module::Module, name::Symbol, value,
              [success_order::Symbol, [fail_order::Symbol=success_order]) -> success::Bool

Effectuer 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.

Julia 1.11

Cette fonction nécessite Julia 1.11 ou une version ultérieure.

Voir aussi setpropertyonce! et setglobal!.

source
Core.replaceglobal!Function
replaceglobal!(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.

Julia 1.11

Cette fonction nécessite Julia 1.11 ou une version ultérieure.

Voir aussi replaceproperty! et setglobal!.

source

Documentation

(Voir aussi le chapitre documentation.)

Core.@docMacro

Documentation

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" TypeToDoc

Pour 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.

source
Base.Docs.HTMLType

HTML(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>")
end
Avertissement

HTML 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.

source
Base.Docs.TextType

Text(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")
end
Avertissement

Text 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.

source
Base.Docs.hasdocFunction
Docs.hasdoc(mod::Module, sym::Symbol)::Bool

Retourne true si sym dans mod a une docstring et false sinon.

source
Base.Docs.undocumented_namesFunction
undocumented_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.

source

Code loading

Base.identify_packageFunction
Base.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 LinearAlgebra
source
Base.locate_packageFunction
Base.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"
source
Base.requireFunction
require(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.

source
Base.compilecacheFunction
Base.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.

source
Base.isprecompiledFunction
Base.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.

Julia 1.10

Cette fonction nécessite au moins Julia 1.10.

source
Base.get_extensionFunction
get_extension(parent::Module, extension::Symbol)

Retourne le module pour extension de parent ou retourne nothing si l'extension n'est pas chargée.

source

Internals

Base.GC.gcFunction
GC.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.

Avertissement

Une utilisation excessive entraînera probablement une mauvaise performance.

source
Base.GC.enableFunction
GC.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.

Warning

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.

source
Base.GC.@preserveMacro
GC.@preserve x1 x2 ... xn expr

Marquez 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 x qui 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
101

Lors 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
5
source
Base.GC.safepointFunction
GC.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.

Julia 1.4

Cette fonction est disponible depuis Julia 1.4.

source
Base.GC.enable_loggingFunction
GC.enable_logging(on::Bool)

Lorsqu'il est activé, imprime des statistiques sur chaque GC dans stderr.

source
Base.Meta.lowerFunction
lower(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.

source
Base.Meta.@lowerMacro
@lower [m] x

Retourne 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.

source
Base.Meta.parseMethod
parse(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)
source
Base.Meta.parseMethod
parse(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")))
source
Base.Meta.ParseErrorType
ParseError(msg)

L'expression passée à la fonction parse n'a pas pu être interprétée comme une expression Julia valide.

source
Base.macroexpandFunction
macroexpand(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)
source
Base.@macroexpandMacro
@macroexpand [mod,] ex

Renvoie 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 macroexpand prend un argument clé recursive, @macroexpand est toujours récursif. Pour une version non récursive des macros, voir @macroexpand1.
  • Alors que macroexpand a un argument module explicite, @macroexpand se 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.

Julia 1.11

La forme à deux arguments nécessite au moins Julia 1.11.

source
Base.code_loweredFunction
code_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.

source
Base.code_typedFunction
code_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 :source ou :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
) => Float64
source
Base.precompileFunction
precompile(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.

source
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.

source
Base.jit_total_bytesFunction
Base.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.

source

Meta

Base.Meta.quotFunction
Meta.quot(ex)::Expr

Citer 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)
source
Base.isexprFunction
Meta.isexpr(ex, head[, n])::Bool

Retourne 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)
true
source
Base.isidentifierFunction
 isidentifier(s) -> Bool

Retourne 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)
source
Base.isoperatorFunction
isoperator(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)
source
Base.isunaryoperatorFunction
isunaryoperator(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)
source
Base.isbinaryoperatorFunction
isbinaryoperator(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)
source
Base.Meta.show_sexprFunction
Meta.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))
source