On Mon, Jul 20, 2015 at 9:41 PM, Brandon Taylor <brandon.taylor...@gmail.com> wrote: > Dicts seem to work pretty well for this kind of thing. >
For storage, maybe. > > 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. You cannot assign to module. You need `eval` >> >> 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. >>> >>>>>>> >>>>>>>> >>> >>>>>>> >>>>>>>>