From 0512336edfc7bcd2fdf700dc0ba55e4c00256320 Mon Sep 17 00:00:00 2001 From: David Gold Date: Fri, 10 Jul 2015 11:39:03 -0400 Subject: [PATCH] Spin off lift macro to own package --- perf/lift.jl | 32 ------------------------- src/NullableArrays.jl | 2 -- src/lift.jl | 56 ------------------------------------------- test/lift.jl | 19 --------------- test/runtests.jl | 1 - 5 files changed, 110 deletions(-) delete mode 100644 perf/lift.jl delete mode 100644 src/lift.jl delete mode 100644 test/lift.jl diff --git a/perf/lift.jl b/perf/lift.jl deleted file mode 100644 index 79407e8..0000000 --- a/perf/lift.jl +++ /dev/null @@ -1,32 +0,0 @@ -using NullableArrays - -srand(1) -N = 5_000_000 -f(x, y) = x * y -g(x, y) = x + y - -X = NullableArray(rand(N)) -Y = NullableArray(rand(N)) - -Xn = NullableArray(rand(N), rand(Bool, N)) -Yn = NullableArray(rand(N), rand(Bool, N)) - -function tracedot(X, Y) - res = Nullable(0.0) - for i in 1:length(X) - res += @^ f(X[i], Y[i]) Float64 - end - return res -end - -function profile_no_nulls() - tracedot(X, Y) - # tracedot(X, Y) - @time(tracedot(X, Y)) -end - -function profile_half_nulls() - tracedot(Xn, Yn) - # tracedot(Xn, Yn) - @time(tracedot(Xn, Yn)) -end diff --git a/src/NullableArrays.jl b/src/NullableArrays.jl index e2d8fe5..4e8a0b2 100644 --- a/src/NullableArrays.jl +++ b/src/NullableArrays.jl @@ -7,7 +7,6 @@ module NullableArrays NullableMatrix, # Macros - @^, # Methods dropnull, @@ -25,7 +24,6 @@ module NullableArrays include("indexing.jl") include("map.jl") include("nullablevector.jl") - include("lift.jl") include("operators.jl") include("broadcast.jl") include("mapreduce.jl") diff --git a/src/lift.jl b/src/lift.jl deleted file mode 100644 index 29f4704..0000000 --- a/src/lift.jl +++ /dev/null @@ -1,56 +0,0 @@ - -#----- @^ --------------------------------------------------------------------# - -macro ^(call, T...) - arg_cache = Dict{Union{Symbol, Expr}, Expr}() - if !(isa(call, Expr)) || call.head != :call - throw(ArgumentError("@^: argument must be a function call")) - end - - if length(T) == 1 - e_type = T[1] - else - throw(ArgumentError("@^: wrong number of arguments")) - end - - e_call = gen_calls(call, arg_cache) - args = collect(keys(arg_cache)) - e_nullcheck = :($(args[1]).isnull) - for i = 2:length(args) - e_nullcheck = Expr(:||, e_nullcheck, :($(args[i]).isnull)) - end - - return esc(:( - if $e_nullcheck - Nullable{$e_type}() - else - Nullable($e_call) - end ) - ) -end - -# base case for literals -gen_calls(e, arg_cache) = e - -# base case for symbols -function gen_calls(e::Symbol, arg_cache) - new_arg = get!(arg_cache, e, :($e.value)) - return new_arg -end - -# recursively modify expression tree -function gen_calls(e::Expr, arg_cache) - if e.head == :call - return Expr(:call, e.args[1], gen_calls(e.args[2:end], arg_cache)...) - elseif e.head == :ref - new_arg = get!(arg_cache, e, :($e.value)) - return new_arg - else - return e - end -end - -# recursive case for `args` field arrays -function gen_calls(args::Array, arg_cache) - return [ gen_calls(arg, arg_cache) for arg in args ] -end diff --git a/test/lift.jl b/test/lift.jl deleted file mode 100644 index b6f4052..0000000 --- a/test/lift.jl +++ /dev/null @@ -1,19 +0,0 @@ -module TestLift - using NullableArrays - using Base.Test - - f(x::Int) = 5 * x - g(x::Int, y::Int) = x + y - x = Nullable(5) - y = Nullable{Int}() - X = NullableArray([1, 2, 3, 4, 5]) - - @test isequal(@^(f(x), Int), Nullable(25)) - @test isequal(@^(f(y), Int), Nullable{Int}()) - @test_throws ArgumentError eval(macroexpand(:( @^f(y) ))) - @test_throws ArgumentError eval(macroexpand(:( @^ if x > 0; f(x) end ))) - - @test isequal(@^(f(X[1]) + g(x, X[1]), Int), Nullable(11)) - @test isequal(@^(f(X[1]) + g(y, X[1]), Int), Nullable{Int}()) - -end diff --git a/test/runtests.jl b/test/runtests.jl index 1cc12fb..9fb0322 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -11,7 +11,6 @@ my_tests = [ "indexing.jl", "map.jl", "broadcast.jl", - "lift.jl", "nullablevector.jl", "nullablematrix.jl" ]