Ok, a thought, Julia has an inbuilt idea of a module. Would it be possible to hijack this functionality to provide pseudo-environments? That is, never referring to anything that is not already in an explicit module? And also, have a data-frame simply be a module?
On Friday, July 10, 2015 at 11:31:36 PM UTC+8, Brandon Taylor wrote: > > I don't know if you came across the vignette? > http://cran.r-project.org/web/packages/lazyeval/vignettes/lazyeval.html ? > dplyr uses lazyeval extensively, see > http://cran.r-project.org/web/packages/dplyr/vignettes/nse.html . The > cool thing about being able to incorporate this kind of thing in Julia > would be being able to use the self-reflection capabilities. > > On Friday, July 10, 2015 at 10:57:16 AM UTC-4, Cedric St-Jean wrote: >> >> >> >> On Thursday, July 9, 2015 at 10:35:30 PM UTC-4, Brandon Taylor wrote: >>> >>> To walk back in time, you could say something like: compile this like >>> this was is in line 8. Or compile this like this was in line 5. It seems >>> like Julia already has some of this functionality in macros. Internal >>> variables are compiled as if they were in local scope. But escaped >>> expressions are compiled as if they were in global scope. >>> >> >> Could you provide context or a real-world use? I've looked at the >> lazyeval package, and I'm not entirely sure what it does. Does it provide >> lazy evaluation for R? That's easy to achieve in Julia (well, sorta). >> Instead of >> >> d = determinant(matrix) >> .... >> u = 2 * d >> >> you can write >> >> d = ()->determinant(matrix) >> .... >> u = 2 * d() # determinant is evaluated on use, in the context where it >> was originally defined >> >> With macros this can turn into >> >> d = lazy(determinant(matrix)) >> >> which looks nicer (and also can avoid computing the determinant twice if >> d() is called twice). >> >> Cédric >> >> >>> >>> On Thursday, July 9, 2015 at 9:11:05 PM UTC-4, Cedric St-Jean wrote: >>>> >>>> >>>> >>>> On Thursday, July 9, 2015 at 4:14:32 PM UTC-4, Brandon Taylor wrote: >>>>> >>>>> Ok, here's where I'm getting hung up. You said that the compiler >>>>> figures out the creation/lifetime of all variables at compile time. So >>>>> does >>>>> that mean there's a list like: >>>>> >>>>> a maps to location 0 and exists from line 3 to line 9 >>>>> b maps to location 1 and exists from line 7 to line 9 >>>>> a maps to location 10 and exists from line 7 to 9? >>>>> >>>>> and that to map variables to locations on any particular line, the >>>>> compiler works its way up the list, >>>>> >>>> >>>> Yes, more or less. >>>> >>>> >>>>> >>>>> This is perhaps even more helpful than the environment. The >>>>> environment is immediately and completely determinable at any point in >>>>> the >>>>> program. This could make it possible to walk back in time even within the >>>>> same scope. >>>>> >>>> >>>> Could you expand on what you're thinking of? >>>> >>>> This kind of compile-time environment could conceivably be exposed to >>>> macros. Common Lisp had proposals along that line ( >>>> https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node102.html) but as >>>> far as I can tell, it was too complicated and not useful enough, so it was >>>> axed/neutered at some point in the standardization process. >>>> >>>> > 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 >>>> >>>> I don't know about R, but to me that sounds entirely doable with >>>> closures (and macros will give you a nice syntax for it) >>>> >>>> >>>>> >>>>> On Wednesday, July 8, 2015 at 8:31:44 PM UTC-4, Yichao Yu wrote: >>>>>> >>>>>> On Wed, Jul 8, 2015 at 8:23 PM, Yichao Yu <yyc...@gmail.com> wrote: >>>>>> > On Wed, Jul 8, 2015 at 7:48 PM, Brandon Taylor >>>>>> > <brandon....@gmail.com> wrote: >>>>>> >> Hmm, maybe I'm confused about compilation vs interpretation. Let >>>>>> me >>>>>> >> rephrase. Regardless of a how or when statement is evaluated, it >>>>>> must have >>>>>> >> access at least to its parent environments to successfully resolve >>>>>> a symbol. >>>>>> >>>>>> AFAIK, the only scope you can dynamically add variable to is the >>>>>> global scope. (This can be done with the `global` keyword or `eval` >>>>>> etc). The compiler figure out the creation/lifetime of all local >>>>>> variables (at compile time). Therefore, to access a variable in the >>>>>> parent scope: >>>>>> >>>>>> 1. If it's a global, then it need a runtime lookup/binding (the >>>>>> reason >>>>>> global are slow) >>>>>> 2. If it's in a parent non-global scope, the compiler can figure out >>>>>> how to bind/access it at compile time and no extra (lookup) code at >>>>>> runtime is necessary. >>>>>> >>>>>> >> >>>>>> > >>>>>> > A julia local variable is basically a variable in C. There's a >>>>>> table >>>>>> > at compile time to map between symbols and stack slots (or >>>>>> whereever >>>>>> > they are stored) but such a map does not exist at runtime anymore >>>>>> > (except for debugging). >>>>>> > >>>>>> >> >>>>>> >> On Wednesday, July 8, 2015 at 7:34:09 PM UTC-4, Brandon Taylor >>>>>> wrote: >>>>>> >>> >>>>>> >>> They must exist at runtime and at local scope. Evaluating a >>>>>> symbol is >>>>>> >>> impossible without a pool of defined symbols in various scopes to >>>>>> match it >>>>>> >>> to. Unless I'm missing something? >>>>>> >>> >>>>>> >>> On Wednesday, July 8, 2015 at 7:26:27 PM UTC-4, Jameson wrote: >>>>>> >>>> >>>>>> >>>> There are global symbol tables for static analysis / reflection, >>>>>> but they >>>>>> >>>> do not exist at runtime or for the local scope. >>>>>> >>>> >>>>>> >>>> On Wed, Jul 8, 2015 at 7:06 PM Brandon Taylor < >>>>>> brandon....@gmail.com> >>>>>> >>>> wrote: >>>>>> >>>>> >>>>>> >>>>> Surely environments already exist somewhere inside Julia? How >>>>>> else could >>>>>> >>>>> you keep track of scope? It would be simply a matter of >>>>>> granting users >>>>>> >>>>> access to them. Symbol tables in a mutable language are by >>>>>> default mutable. >>>>>> >>>>> It would certainly be possible only give users access to >>>>>> immutable >>>>>> >>>>> reifications (which could solve a bunch of problems as is). >>>>>> However, it >>>>>> >>>>> seems natural to match mutable symbol tables with mutable >>>>>> reifications, and >>>>>> >>>>> immutable symbol tables with immutable reifications. >>>>>> >>>>> >>>>>> >>>>> >>>>>> >>>>> On Wednesday, July 8, 2015 at 6:50:03 PM UTC-4, Brandon Taylor >>>>>> wrote: >>>>>> >>>>>> >>>>>> >>>>>> I'm not sure I understand... >>>>>> >>>>>> >>>>>> >>>>>> On Wednesday, July 8, 2015 at 6:24:37 PM UTC-4, John Myles >>>>>> White wrote: >>>>>> >>>>>>> >>>>>> >>>>>>> Reified scope makes static analysis much too hard. Take any >>>>>> criticism >>>>>> >>>>>>> of mutable state: they all apply to globally mutable symbol >>>>>> tables. >>>>>> >>>>>>> >>>>>> >>>>>>> On Wednesday, July 8, 2015 at 10:26:23 PM UTC+2, Milan >>>>>> Bouchet-Valat >>>>>> >>>>>>> wrote: >>>>>> >>>>>>>> >>>>>> >>>>>>>> Le mercredi 08 juillet 2015 à 13:20 -0700, Brandon Taylor a >>>>>> écrit : >>>>>> >>>>>>>> > All functions. >>>>>> >>>>>>>> Well, I don't know of any language which doesn't have >>>>>> scoping >>>>>> >>>>>>>> rules... >>>>>> >>>>>>>> >>>>>> >>>>>>>> Anyway, I didn't say scoping rules are necessarily >>>>>> confusing, I was >>>>>> >>>>>>>> only referring to R formulas. But according to the examples >>>>>> you >>>>>> >>>>>>>> posted, >>>>>> >>>>>>>> your question appears to be different. >>>>>> >>>>>>>> >>>>>> >>>>>>>> >>>>>> >>>>>