Le samedi 25 juillet 2015 à 01:58 -0700, Brandon Taylor a écrit :
> Well a somewhat unique feature or R is automatic argument recycling, 
> so that when doing operations on dataframes, it's a lot easier to 
> incorporate data from outside of the dataframe into evaluation. Let's 
> say you are doing a stepwise logisitic growth model, like dP/dt = 
> r*P*(1 - P/K). Let's say that r a known single value in the global 
> environment, K is going be predicted from some environmental 
> variables within your dataframe, and P is going to be given as an 
> initial condition and its evolution modeled. The R way of looking at 
> this would be to set up an environment where the dataframe 
> environment inherits from the global environment, and to evaluate 
> within this environment regardless of calling environment. That means 
> that within a sub sub function, you can use r to represent, maybe, a 
> row number, and K, to represent, maybe, a column number, and that you 
> can still evaluate an expression like r*P*(1 - P/K) with no problem. 
> This is most useful when writing your own functions. For example, you 
> could build some sort of time-series predictive package that could 
> handle not only logisitic models, but other models, like the Lotka
> -Volterra models. Now, I'm not saying this is impossible to do in 
> Julia: in fact, I'm quite sure it is. It's just less convenient.
Thanks for the example. I don't think I would use an environment for
that. Why not have the function take a data frame with the variables, a
nd constants as an argument? As I understand it, the only interest of
environments is that you don't have to make a difference between
variables in the data frame and variables in the global scope. But I
also find it confusing that you don't know where the data comes from,
and I've seen students make mistakes because of that.

That said, I don't understand exactly what the code you describe would
look like, so I might be missing something. If you can provide a few
lines to illustrate a toy example, it could help.

> The other nice things about environments are more trivial. For 
> example, you might be doing a homework assignment with several 
> problems. At the start of each problem, you could define a new 
> environment. At the end of the problem, you could display the entire 
> content of the problem's environment as a way to track down errors. 
> When looking at an answer sheet, you could compare intermediate 
> results and see where you went wrong. Again, not impossible to do 
> with Julia; you would probably want to set up a dict for each 
> problem, and do all operations within that dict. Which, I guess, is 
> basically what is happening under the hood in a language with 
> environments.
You should be able to do this by working inside modules in Julia. In
particular, workspace() looks exactly like what you're describing: once
you're done with one problem, call it to get a clean environment,
storing globals in the LastMain module.


Regards

> I'll just nod in agreement with the fexpr stuff and pretend I 
> understand.
> 
> On Friday, July 24, 2015 at 4:11:37 PM UTC-4, Scott Jones wrote:
> > I should give you a hard time about arguing from authority ;-), but 
> > I was there at the same time and knew KMP, so I wouldn't want to 
> > argue too much with him either, and I am in agreement with you 
> > about fexprs vs. macros, and the equivalent issues in Julia.
> > 
> > On Friday, July 24, 2015 at 2:31:54 PM UTC-4, Stefan Karpinski 
> > wrote:
> > > Lisp has already been down this path – fexprs were special forms 
> > > with behavior similar to R's functions, and they were deprecated 
> > > in the 1980s in favor of macros, https://en.wikipedia.org/wiki/Fe
> > > xpr#Mainstream_use_and_deprecation:
> > > 
> > > > His central objection was that, in a Lisp dialect that allows 
> > > > fexprs, static analysis cannot determine generally whether an 
> > > > operator represents an ordinary function or a fexpr — 
> > > > therefore, static analysis cannot determine whether or not the 
> > > > operands will be evaluated. In particular, the compiler cannot 
> > > > tell whether a subexpression can be safely optimized, since the 
> > > > subexpression might be treated as unevaluated data at run-time.
> > > If Lispers think a feature is too dynamic and hard to understand, 
> > > that's a danger sign. In general, I wouldn't want to argue too 
> > > much with Kent Pitman :-)
> > > 
> > > On the subject of Kent Pitman, here's a random bit of Lisp wisdom 
> > > from this interview with him:
> > > 
> > > > I like Lisp's willingness to represent itself. People often 
> > > > explain this as its ability to represent itself, but I think 
> > > > that's wrong. Most languages are capable of representing 
> > > > themselves, but they simply don't have the will to. Lisp 
> > > > programs are represented by lists and programmers are aware of 
> > > > that. It wouldn't matter if it had been arrays. It does matter 
> > > > that it's program structure that is represented, and not 
> > > > character syntax, but beyond that the choice is pretty 
> > > > arbitrary. It's not important that the representation be the 
> > > > Right® choice. It's just important that it be a common, agreed
> > > > -upon choice so that there can be a rich community of program
> > > > -manipulating programs that "do trade" in this common 
> > > > representation.
> > > This is probably the best quote about homoiconicity I've read 
> > > anywhere and explains why the term is tricky to pin down.
> > > 
> > > On Fri, Jul 24, 2015 at 2:21 PM, Brandon Taylor <
> > > brandon....@gmail.com> wrote:
> > > > Macros seem to have a bunch of limitations. They can't be 
> > > > overloaded to take advantage of Julia's typing system. Their 
> > > > functionality can somewhat mimic evaluation within a function 
> > > > in its direct parent environment, but what if you want to write 
> > > > functions within your macro, or macros inside your macro, etc? 
> > > > Probably still possible to do many things, but it would invovle 
> > > > passing expressions back in forth in confusing ways, where as 
> > > > with environments, as long as an environment is kept attached 
> > > > to every expression, they can be immediately evaluated in any 
> > > > sub or subsub etc. environment.
> > > > 
> > > 

Reply via email to