Julia Language
Expressions
Recherche…
Introduction aux expressions
Les expressions sont un type d'objet spécifique dans Julia. Vous pouvez penser à une expression représentant un morceau de code Julia qui n'a pas encore été évalué (c'est-à-dire exécuté). Il y a ensuite des fonctions et des opérations spécifiques, comme eval()
qui évaluera l'expression.
Par exemple, nous pourrions écrire un script ou entrer dans l'interpréteur les éléments suivants: julia> 1 + 1 2
Une façon de créer une expression consiste à utiliser la syntaxe :()
. Par exemple:
julia> MyExpression = :(1+1)
:(1 + 1)
julia> typeof(MyExpression)
Expr
Nous avons maintenant un objet de type Expr
. Ayant juste été formé, il ne fait rien - il se contente de rester comme tout autre objet jusqu'à ce qu'il soit agi. Dans ce cas, nous pouvons évaluer cette expression en utilisant la fonction eval()
:
julia> eval(MyExpression)
2
Ainsi, nous voyons que les deux suivants sont équivalents:
1+1
eval(:(1+1))
Pourquoi voudrions-nous passer par la syntaxe beaucoup plus compliquée dans eval(:(1+1))
si nous voulons juste trouver ce que 1 + 1 est égal? La raison de base est que nous pouvons définir une expression à un point de notre code, la modifier éventuellement ultérieurement, puis l’évaluer ultérieurement. Cela peut potentiellement ouvrir de nouvelles fonctionnalités puissantes au programmeur Julia. Les expressions sont un élément clé de la métaprogrammation chez Julia.
Créer des expressions
Plusieurs méthodes différentes peuvent être utilisées pour créer le même type d'expression. L' introduction d'expressions a mentionné la syntaxe :()
. Peut-être que le meilleur endroit pour commencer, cependant, est avec les cordes. Cela aide à révéler certaines des similarités fondamentales entre les expressions et les chaînes de caractères de Julia.
Créer une expression à partir d'une chaîne
De la documentation Julia:
Chaque programme Julia commence sa vie comme une ficelle
En d'autres termes, tout script Julia est simplement écrit dans un fichier texte, qui n'est rien d'autre qu'une chaîne de caractères. De même, toute commande Julia entrée dans un interpréteur n'est qu'une chaîne de caractères. Le rôle de Julia ou de tout autre langage de programmation est alors d'interpréter et d'évaluer les chaînes de caractères de manière logique et prévisible, de sorte que ces chaînes de caractères puissent être utilisées pour décrire ce que le programmeur souhaite que l'ordinateur accomplisse.
Ainsi, une façon de créer une expression consiste à utiliser la fonction parse()
appliquée à une chaîne. L'expression suivante, une fois évaluée, affectera la valeur 2 au symbole x
.
MyStr = "x = 2"
MyExpr = parse(MyStr)
julia> x
ERROR: UndefVarError: x not defined
eval(MyExpr)
julia> x
2
Créer une expression à l'aide de :()
Syntaxe
MyExpr2 = :(x = 2)
julia> MyExpr == MyExpr2
true
Notez qu'avec cette syntaxe, Julia traitera automatiquement les noms d'objets en référence à des symboles. Nous pouvons voir cela si nous regardons les args
de l'expression. (Voir Champs des objets d'expression pour plus de détails sur le champ args
dans une expression.)
julia> MyExpr2.args
2-element Array{Any,1}:
:x
2
Créer une expression à l'aide de la fonction Expr()
MyExpr3 = Expr(:(=), :x, 2)
MyExpr3 == MyExpr
Cette syntaxe est basée sur la notation de préfixe . En d'autres termes, le premier argument de la fonction spécifiée pour la fonction Expr()
est la head
ou le préfixe. Les autres sont les arguments
de l'expression. La head
détermine quelles opérations seront effectuées sur les arguments.
Pour plus de détails à ce sujet, voir Champs des objets d'expression
Lorsque vous utilisez cette syntaxe, il est important de faire la distinction entre l'utilisation d'objets et de symboles pour les objets. Par exemple, dans l'exemple ci-dessus, l'expression attribue la valeur 2
au symbole :x
, une opération parfaitement sensible. Si nous utilisions x
lui-même dans une expression comme celle-là, nous obtiendrions un résultat absurde:
julia> Expr(:(=), x, 5)
:(2 = 5)
De même, si nous examinons les args
nous voyons:
julia> Expr(:(=), x, 5).args
2-element Array{Any,1}:
2
5
Ainsi, la fonction Expr()
n'effectue pas la même transformation automatique en symboles que la syntaxe :()
pour créer des expressions.
Créer des expressions multilignes en utilisant les quote...end
MyQuote =
quote
x = 2
y = 3
end
julia> typeof(MyQuote)
Expr
Notez qu'avec quote...end
on peut créer des expressions contenant d'autres expressions dans leur champ args
:
julia> typeof(MyQuote.args[2])
Expr
Voir Champs des objets d'expression pour plus d'informations sur ce champ args
.
Plus sur la création d'expressions
Cet exemple donne simplement les bases pour créer des expressions. Voir aussi, par exemple, Interpolation et Expressions et champs des objets d'expression pour plus d'informations sur la création d'expressions plus complexes et avancées.
Champs d'objets d'expression
Comme mentionné dans l' introduction aux expressions, les expressions sont un type d'objet spécifique dans Julia. En tant que tels, ils ont des champs. Les deux champs les plus utilisés d'une expression sont sa head
et ses args
. Par exemple, considérons l'expression
MyExpr3 = Expr(:(=), :x, 2)
discuté dans Création d'expressions . Nous pouvons voir la head
et les args
comme suit:
julia> MyExpr3.head
:(=)
julia> MyExpr3.args
2-element Array{Any,1}:
:x
2
Les expressions sont basées sur la notation par préfixe . En tant que tel, la head
spécifie généralement l'opération à effectuer sur les args
. La tête doit être du type Julia Symbol
.
Lorsqu'une expression doit affecter une valeur (lorsqu'elle est évaluée), elle utilisera généralement une tête de :(=)
. Il y a bien sûr des variations évidentes à cela que l'on peut employer, par exemple:
ex1 = Expr(:(+=), :x, 2)
: appel à la tête d'expression
Une autre commune head
des expressions est :call
. Par exemple
ex2 = Expr(:call, :(*), 2, 3)
eval(ex2) ## 6
Suivant les conventions de notation des préfixes, les opérateurs sont évalués de gauche à droite. Ainsi, cette expression signifie ici que nous appellerons la fonction spécifiée sur le premier élément des args
sur les éléments suivants. Nous pourrions pareillement avoir:
julia> ex2a = Expr(:call, :(-), 1, 2, 3)
:(1 - 2 - 3)
Ou d'autres fonctions potentiellement plus intéressantes, par exemple
julia> ex2b = Expr(:call, :rand, 2,2)
:(rand(2,2))
julia> eval(ex2b)
2x2 Array{Float64,2}:
0.429397 0.164478
0.104994 0.675745
Détermination automatique de la head
lors de l'utilisation de :()
notation de création d'expression
Notez que :call
est implicitement utilisé comme tête dans certaines constructions d’expressions, par exemple
julia> :(x + 2).head
:call
Ainsi, avec la syntaxe :()
pour créer des expressions, Julia cherchera à déterminer automatiquement la tête correcte à utiliser. De même:
julia> :(x = 2).head
:(=)
En fait, si vous n'êtes pas certain de ce que la bonne tête à utiliser pour une expression que vous créez en utilisant, par exemple, Expr()
cela peut être un outil utile pour obtenir des conseils et des idées sur ce qu'il faut utiliser.
Interpolation et Expressions
La création d'expressions mentionne que les expressions sont étroitement liées aux chaînes. En tant que tels, les principes d'interpolation au sein des chaînes sont également pertinents pour les expressions. Par exemple, en interpolation de base des chaînes, on peut avoir quelque chose comme:
n = 2
julia> MyString = "there are $n ducks"
"there are 2 ducks"
Nous utilisons le signe $
pour insérer la valeur de n
dans la chaîne. Nous pouvons utiliser la même technique avec des expressions. Par exemple
a = 2
ex1 = :(x = 2*$a) ## :(x = 2 * 2)
a = 3
eval(ex1)
x # 4
Contraste ceci ceci:
a = 2
ex2 = :(x = 2*a) # :(x = 2a)
a = 3
eval(ex2)
x # 6
Ainsi, avec le premier exemple, nous définissons à l'avance la valeur de a
qui sera utilisée au moment de l'évaluation de l'expression. Avec le second exemple, cependant, le compilateur Julia ne cherchera à a
pour trouver sa valeur au moment de l' évaluation de notre expression.
Références externes sur les expressions
Il existe un certain nombre de ressources Web utiles qui peuvent vous aider à mieux connaître les expressions dans Julia. Ceux-ci inclus:
- Julia Docs - Métaprogrammation
- Wikibooks - Métaprogrammation Julia
- Les macros de Julia, les expressions, etc. pour et par les confus, par Gray Calhoun
- Mois de Julia - Métaprogrammation, par Andrew Collier
- Différenciation symbolique en Julia, par John Myles White
SO Messages:
- Qu'est-ce qu'un "symbole" dans Julia? Répondre par Stefan Karpinski
- Pourquoi julia exprime-t-elle cette expression de manière complexe?
- Explication de l'exemple d'interpolation de l'expression Julia