On Thu, Jul 9, 2015 at 9:58 AM, Cedric St-Jean <cedric.stj...@gmail.com> wrote:
> Environments are very natural in interpreted languages, but I'm not aware of
> any fully-compiled language that supports them because they'd be a major
> headache. I agree that macro behavior can be hard to predict. In Common Lisp
> with Emacs, one can macroexpand any expression anywhere with one keypress,
> and it is incredibly useful for figuring things out. I'm sure that Julia
> will eventually get that functionality, it's several orders of magnitude
> easier than supporting environments.

Julia already have `macroexpand` so I guess you are talking about
editor/REPL feature?

>
>
>
>
> On Wednesday, July 8, 2015 at 9:51:16 PM UTC-4, Brandon Taylor wrote:
>>
>> Edit: Hmm, so that means that any implementation of environments would
>> have to be handled in two separate ways: one by the compiler for non-global
>> scope, and one in run time for the special global system?]
>>
>>
>> On Wednesday, July 8, 2015 at 9:49:50 PM UTC-4, Brandon Taylor wrote:
>>>
>>> Hmm, so that means that any implementation of environments would have to
>>> be handled in to separate ways: one by the compiler for non-global scope,
>>> and one in run time using a second for the special global system?]
>>>
>>>
>>> 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.
>>>> >>>>>>>>
>>>> >>>>>>>>
>>>> >>>>>>>> Regards
>>>> >>>>>>>>
>>>> >>>>>>>> > On Wednesday, July 8, 2015 at 4:18:09 PM UTC-4, Milan
>>>> >>>>>>>> > Bouchet-Valat
>>>> >>>>>>>> > wrote:
>>>> >>>>>>>> > > Le mercredi 08 juillet 2015 à 12:57 -0700, Brandon Taylor a
>>>> >>>>>>>> > > écrit
>>>> >>>>>>>> > > :
>>>> >>>>>>>> > >
>>>> >>>>>>>> > > > If scoping rules are too complicated and cause confusion,
>>>> >>>>>>>> > > > why
>>>> >>>>>>>> > > > are
>>>> >>>>>>>> > >
>>>> >>>>>>>> > > > they built into the base implementation of function?
>>>> >>>>>>>> > > What do you mean? Which function?
>>>> >>>>>>>> > >
>>>> >>>>>>>> > > > On Wednesday, July 8, 2015 at 3:48:52 PM UTC-4, Milan
>>>> >>>>>>>> > > > Bouchet
>>>> >>>>>>>> > > -Valat
>>>> >>>>>>>> > > > wrote:
>>>> >>>>>>>> > > > > Le mercredi 08 juillet 2015 à 12:34 -0700, Brandon
>>>> >>>>>>>> > > > > Taylor a
>>>> >>>>>>>> > > écrit :
>>>> >>>>>>>> > > > >
>>>> >>>>>>>> > > > > > 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 the contrary, I think well-designed macros can be
>>>> >>>>>>>> > > > > much
>>>> >>>>>>>> > > easier to
>>>> >>>>>>>> > > > >
>>>> >>>>>>>> > > > > think about than environments in R. If the macro takes
>>>> >>>>>>>> > > > > a
>>>> >>>>>>>> > > DataFrame
>>>> >>>>>>>> > > > > object and an expression, there's no ambiguity about
>>>> >>>>>>>> > > > > what the
>>>> >>>>>>>> > > scope
>>>> >>>>>>>> > > > > is.
>>>> >>>>>>>> > > > > This is even better if variables that should be found
>>>> >>>>>>>> > > > > in the
>>>> >>>>>>>> > > data
>>>> >>>>>>>> > > > > frame
>>>> >>>>>>>> > > > > are passed as symbols, like :var, while standard
>>>> >>>>>>>> > > > > variables
>>>> >>>>>>>> > > > > are
>>>> >>>>>>>> > > > > specified as usual.
>>>> >>>>>>>> > > > >
>>>> >>>>>>>> > > > > On the other hand, I find R formulas too flexible and
>>>> >>>>>>>> > > > > complex
>>>> >>>>>>>> > > to
>>>> >>>>>>>> > > > > reason
>>>> >>>>>>>> > > > > about. You never know whether an object will be found
>>>> >>>>>>>> > > > > in the
>>>> >>>>>>>> > > > > formula's
>>>> >>>>>>>> > > > > environment, in one of the parent environments of the
>>>> >>>>>>>> > > > > function/package
>>>> >>>>>>>> > > > > you called, in your function, or in the global
>>>> >>>>>>>> > > > > environment.
>>>> >>>>>>>> > > > >
>>>> >>>>>>>> > > > >
>>>> >>>>>>>> > > > > Regards
>>>> >>>>>>>> > > > >
>>>> >>>>>>>> > > > > > 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
>>>> >>>>>>>> > > > > > >
>>>> >>>>>>>> > > > > > > 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?
>>>> >>>>>>>> > > > > > > >

Reply via email to