damn. of course. thanks. andrew
On Friday, 5 June 2015 20:51:00 UTC-3, Yichao Yu wrote: > > Please see this section of the manual > > http://julia.readthedocs.org/en/latest/manual/metaprogramming/?highlight=quotenode#hygiene > > > The following is not the best way to solve this problem (you probably > don't want to escape everything) but it's a simple enough way to get > this particular case working > > ```julia > using Base.Test > import Base.hash > > function auto_hash(typ::Expr) > @assert typ.head == :type > quote > function hash(a::$(typ.args[2])) > 1 > end > end > end > > macro auto(typ) > @assert typ.head == :type > hash = auto_hash(typ) > r = quote > $typ > $hash > end > esc(r) > end > > println(macroexpand(:(@auto type A end))) > @auto type A end > @test typeof(A()) == A > @test hash(A()) == 1 > > println("ok") > ``` > > On Fri, Jun 5, 2015 at 7:42 PM, andrew cooke <[email protected] > <javascript:>> wrote: > > i'm trying to write a macro that will define == and hash() for a > composite > > type. > > > > my initial effort is just to define a hash of 1 > > > > using Base.Test > > import Base.hash > > > > function auto_hash(typ::Expr) > > @assert typ.head == :type > > quote > > function hash(a::$(typ.args[2])) > > 1 > > end > > end > > end > > > > macro auto(typ) > > @assert typ.head == :type > > hash = auto_hash(typ) > > r = quote > > $typ > > $hash > > end > > show(r) > > r > > end > > > > @auto type A end > > @test typeof(A()) == A > > @test hash(A()) == 1 > > > > println("ok") > > > > unfortunately this fails - the hash value is some "random" value. > > > > yet the generated code, displayed by show, works when i cut + paste it > into > > julia. here's the result of running the program: > > > > andrew@laptop:~/project/ParserCombinator-0.4> julia-trunk test/auto.jl > > quote # /home/andrew/.julia/v0.4/ParserCombinator/test/auto.jl, line > 18: > > type A > > end # line 19: > > begin # /home/andrew/.julia/v0.4/ParserCombinator/test/auto.jl, > line 8: > > function hash(a::A) # > > /home/andrew/.julia/v0.4/ParserCombinator/test/auto.jl, line 9: > > 1 > > end > > end > > end > > ERROR: LoadError: test failed: 0x0d6a95a0cf175e49 == 1 > > > > here's some cut + pasting: > > > > julia> import Base.hash > > > > julia> type A end # line 19: > > > > julia> begin # /home/andrew/.julia/v0.4/ParserCombinator/test/auto.jl, > line > > 8: > > function hash(a::A) # > > /home/andrew/.julia/v0.4/ParserCombinator/test/auto.jl, line 9: > > 1 > > end > > end > > hash (generic function with 36 methods) > > > > julia> hash(A()) > > 1 > > > > so why, oh why, doesn't my macro work? > > > > *something* is being evaluated ok because the type A is being created. > > > > thanks, > > andrew > > > > > > >
