Je suis en train d'écrire une macro Julia qui transforme ceci:Julia macro pour transformer `f (dim1, dim2, ..) = value` dans` f (valeur, dim1, dim2, ..) `
[par1!(par2(d1,d2)+par3(d1,d2) ,d1,d2,dfix3) for d1 in DIM1, d2 in DIM2]
(pas très inspirant) en quelque chose de beaucoup plus lisible, comme ceci:
@meq par1!(d1 in DIM1, d2 in DIM2, dfix3) = par2(d1,d2)+par3(d1,d2)
où par1!()
est une fonction pour définir des données multidimensionnelles et par2()
est un getData() - type de fonction. J'essaie de l'implémenter en utilisant une macro, mais comme je suis sur ma première expérience avec julia marcro, je ne sais pas comment "assembler" l'expression finale des différentes pièces. Voici ce que je fait jusqu'à présent:
macro meq(eq)
# dump(eq)
lhs_par = eq.args[1].args[1]
rhs = eq.args[2]
lhs_dims = eq.args[1].args[2:end]
loop_counters = [d.args[2] for d in lhs_dims if typeof(d) == Expr]
loop_sets = [d.args[3] for d in lhs_dims if typeof(d) == Expr]
loop_wholeElements = [d for d in lhs_dims if typeof(d) == Expr]
lhs_dims_placeholders = []
for d in lhs_dims
if typeof(d) == Expr
push!(lhs_dims_placeholders,d.args[2])
else
push!(lhs_dims_placeholders,d)
end
end
outExp = quote
[$(lhs_par)($(rhs),$(lhs_dims_placeholders ...)) for $(loop_wholeElements ...) ]
end
#show(outExp)
return outExp
end
Cependant, la macro ci-dessus ne compile pas et renvoie une erreur de syntaxe (« spécification d'itération non valide ») en raison de la partie for $(loop_wholeElements)
... en effet, je ne sais pas comment traiter les expressions lhs_dims_placeholders et loop_wholeElements pour "assembler" l'expression développée ...
EDIT:
L'exemple affiché, avec d1
, d2
et dfix3
, est seulement un cas particulier, mais la macro doit être capable de gérer selon les dimensions sont bouclées pour .. Je pense que la mise en macro, il fait que , mais je ne sais pas comment construire l'expression finale .. :-(
Nous vous remercions de votre aide! Je vais essayer MacroTool.jl si je ne peux vraiment pas obtenir la composition de l'expression finale dans la macro que j'ai écrite – Antonello
@Antonello votre macro devrait fonctionner au premier coup d'oeil, mais pour une raison que je ne peux pas expliquer , ça ne marche pas (voir mon edit ci-dessus). – Gnimuc
Merci .. Je pensais la même chose, que le problème est dû à être une compréhension .. Je n'ai pas accès à un pc maintenant, demain je vais essayer .. sinon je peux toujours construire une "chaîne de code" morceau par morceau, puis utilisez parse() pour générer une expression .. – Antonello