2017-07-15 2 views
1

Es sieht aus wie Julia v0.6 brach einige Funktionalität, die ich gerne wiederherstellen würde.Gebrochene Makro-Funktionalität in Julia v0.6

Angenommen, ich habe das Makro, Struktur und Funktion:

macro juliadots(expr::Expr) 
    expr = :(print_with_color(:red, " ●"); 
       print_with_color(:green, "●"); 
       print_with_color(:blue, "● "); 
       print_with_color(:bold, $expr)) 
    return expr 
end 

struct Foo 
    x::String 
end 

function func(foo) 
    @juliadots "$(foo.x)\n" 
end 

myfoo = Foo("hello") 
func(myfoo) 

Dies ist früher zu arbeiten, aber jetzt bekomme ich den Fehler:

ERROR: UndefVarError: myfoo not defined 

Wie kann ich diese Funktionalität in Julia v0 erholen. 6?

+0

funktioniert hier, was ist Ihre Versioninfo? – Gnimuc

+0

@Gnimuc, whoops, musste einen anderen Variablennamen verwenden, damit er ihn nicht als globale Variable erkannte, jetzt verursacht er den Fehler. – Thoth

Antwort

1

Ich kann keine Veränderung Hinweise finden, die diesem entspricht, aber eine schnelle Lösung könnte sein:

# Julia-v0.6 
julia> func(foo) = @juliadots :($("$(foo.x)\n")) 
func (generic function with 1 method) 

julia> @macroexpand @juliadots :($("$(foo.x)\n")) 
quote 
    (Main.print_with_color)(:red, " ●") 
    (Main.print_with_color)(:green, "●") 
    (Main.print_with_color)(:blue, "● ") 
    (Main.print_with_color)(:bold, "$(foo.x)\n") 
end 

# Julia-v0.5 
julia> func(foo) = @juliadots "$(foo.x)\n" 
func (generic function with 1 method) 

julia> macroexpand(:(@juliadots "$(foo.x)\n")) 
quote 
    print_with_color(:red," ●") 
    print_with_color(:green,"●") 
    print_with_color(:blue,"● ") 
    print_with_color(:bold,"$(foo.x)\n") 
end 
2

Ja, so basiert auf Gnimuc Code, wenn Sie Ihr Makro wie folgt schreiben:

julia> macro juliadots(ex::Expr) 
    expr = :(print_with_color(:red, " ●"); 
       print_with_color(:green, "●"); 
       print_with_color(:blue, "● "); 
       print_with_color(:bold, :($($(ex))))) 
    return expr 
end 

julia> func(myfoo) 
●●● hello 

Hier finden Sie eine Diskussion darüber, warum dies erforderlich ist: https://github.com/JuliaLang/julia/issues/15085