In fact, if environments could be reifyed, I'd go so far as to say that Julia should have a separate syntax for a) evaluating an expression in its defining environment and b) evaluating an expression in its evaluation environment.
On Wednesday, July 8, 2015 at 3:53:29 PM UTC-4, Brandon Taylor wrote: > > For comparison, here is the analogous code from DataFramesMeta. > > replace_syms(x, membernames) = x > function replace_syms(e::Expr, membernames) > if e.head == :call && length(e.args) == 2 && e.args[1] == :^ > return e.args[2] > elseif e.head == :. # special case for :a.b > return Expr(e.head, replace_syms(e.args[1], membernames), > typeof(e.args[2]) == Expr && e.args[2].head == > :quote ? e.args[2] : replace_syms(e.args[2], membernames)) > elseif e.head != :quote > return Expr(e.head, (isempty(e.args) ? e.args : map(x -> > replace_syms(x, membernames), e.args))...) > else > if haskey(membernames, e.args[1]) > return membernames[e.args[1]] > else > a = gensym() > membernames[e.args[1]] = a > return a > end > end > end > > function with_helper(d, body) > membernames = Dict{Symbol, Symbol}() > body = replace_syms(body, membernames) > funargs = map(x -> :( getindex($d, $(Meta.quot(x))) ), > collect(keys(membernames))) > funname = gensym() > return(:( function $funname($(collect(values(membernames))...)) $body > end; $funname($(funargs...)) )) > end > > macro with(d, body) > esc(with_helper(d, body)) > end > > On Wednesday, July 8, 2015 at 3:50:12 PM UTC-4, Brandon Taylor wrote: >> >> It should be noted that in R, environments are simply pointers. They take >> up no memory and shouldn't cause drastic slowdowns (I don't think). >> >> On Wednesday, July 8, 2015 at 3:48:08 PM UTC-4, Brandon Taylor wrote: >>> >>> For example, here's a code snippet from R: >>> >>> function (x, data) eval(x$expr, data, x$env) >>> >>> x is an expression which contains an environment attribute. It is >>> evaluated first checking the bindings in data (data being a dataframe) and >>> then checing the bindings in x's environment. >>> >>> On Wednesday, July 8, 2015 at 3:37:04 PM UTC-4, Brandon Taylor wrote: >>>> >>>> *reifying. Deifying environments might not be the best idea. >>>> >>>> On Wednesday, July 8, 2015 at 3:34:53 PM UTC-4, Brandon Taylor wrote: >>>>> >>>>> I was aware of those packages (though I hadn't read the discussions >>>>> referenced). Macros are great but they are incredibly difficult to reason >>>>> with concerning issues of scope (at least for me). Deifying environments >>>>> could solve all of these issues (and so much more) in one fell swoop. >>>>> >>>>> On Wednesday, July 8, 2015 at 3:20:00 PM UTC-4, David Gold wrote: >>>>>> >>>>>> Some of these issues have been thought about fairly extensively by >>>>>> the stats community in particular, precisely on account of the use cases >>>>>> you cite: >>>>>> >>>>>> https://github.com/JuliaStats/DataFrames.jl/pull/472 >>>>>> https://github.com/JuliaStats/DataFrames.jl/issues/504 >>>>>> <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2FJuliaStats%2FDataFrames.jl%2Fissues%2F504&sa=D&sntz=1&usg=AFQjCNHgUEZP8TyJ_BuUyyFA5SIxneOJTA> >>>>>> >>>>>> I think that the matter is still very much an open question. I have >>>>>> no sense that anything is going to be added to Base Julia itself. >>>>>> Currently, the best way (that I know of, anyway) to achieve the delayed >>>>>> evaluation effect is via the use of macros. See for instance: >>>>>> >>>>>> https://github.com/JuliaStats/DataFramesMeta.jl >>>>>> https://github.com/one-more-minute/Lazy.jl >>>>>> >>>>>> I'm hope somebody else will be able to pop in an give a more thorough >>>>>> answer, but the above may at least be a place to start. >>>>>> >>>>>> On Wednesday, July 8, 2015 at 2:03:45 PM UTC-4, Brandon Taylor wrote: >>>>>>> >>>>>>> Hadley Wickham's lazyeval package in R is pretty cool in that you >>>>>>> can attach an environment to an expression, pass it in and out of >>>>>>> functions >>>>>>> with various modifications, and then evaluate the expression within the >>>>>>> original environment (or any other environment that you choose). R in >>>>>>> general has the functions like list2env and list(environment()) that >>>>>>> allow >>>>>>> one to convert an environment into a list and back again (list being >>>>>>> the R >>>>>>> equivalent of a Dict). Are there any plans to add these kind of >>>>>>> features to >>>>>>> Julia? >>>>>>> >>>>>>