And there would need to be a special marker for them, such that if I'm in function f, f[:a] won't get preprocessed as f[:f][:a]
On Tuesday, July 21, 2015 at 10:03:08 AM UTC+8, Brandon Taylor wrote: > > Although that would probably require nested dicts. Each would have a > parent dict, and if a lookup isn't found in the current dict, the parent > dict would be searched. > > On Tuesday, July 21, 2015 at 9:53:50 AM UTC+8, Brandon Taylor wrote: >> >> I should be possible to preprocess code such that everything is put into >> a dict based on the name of enclosing function (and global variables will >> just go into a dict called global). >> >> On Tuesday, July 21, 2015 at 9:42:00 AM UTC+8, Brandon Taylor wrote: >>> >>> Dicts seem to work pretty well for this kind of thing. >>> >>> On Tuesday, July 21, 2015 at 9:38:36 AM UTC+8, Brandon Taylor wrote: >>>> >>>> I'm getting a cannot assign variables in other modules error. >>>> >>>> On Tuesday, July 21, 2015 at 6:39:44 AM UTC+8, Yichao Yu wrote: >>>>> >>>>> On Mon, Jul 20, 2015 at 6:35 PM, Brandon Taylor >>>>> <brandon....@gmail.com> wrote: >>>>> > 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? >>>>> >>>>> I think this would in principle works. A module is basically what >>>>> global scope means so all the performance concern applies. >>>>> >>>>> > >>>>> > >>>>> > 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. >>>>> >>>>>>> >>>>>>>> >>>>> >>>>>>> >>>>>>>> >>>>> >>>>