It's fun growing older with computers. In the days of 8085's, we were almost 
happy to call a subroutine or switch contexts for an interrupt in 20 
microseconds; my gosh, addresses and data must be pushed and popped and all of 
that stuff takes time.  The response earlier in this thread showed that an 
evaluation of a new expression, a much more considerable task, to be the same 
20 microseconds... but these days we consider this to be intolerably slow. :O)

rac

On Jul 19, 2012, at 5:53 AM, Matthias Felleisen wrote:

> 
> Here is a conjecture at a history-based interpretation. 
> 
> Lisp was eval and apply, and that was all there was to it, and calling eval 
> was dirt cheap -- compared to running code. 
> 
> Over the next few decades Lispers learned to "pre-process" Lisp, meaning a 
> lot of dynamic computation was moved to pre-eval time. At the same time, 
> Lispers learned that eval is evil in most cases and that it is often 
> replacable by something simple (like a case dispatch on the op position plus 
> apply). 
> 
> Other languages started being a "Lisp": perl, python, javascript. Instead of 
> learning from Lisp's history, they re-invented it -- starting from a cheap 
> eval cycle. Now eval is popular again. Perhaps this is even justified for 
> initial uses of something like JavaScript. You send some code, it is eval'ed 
> and the evaluation renders some "image" inside of a browser frame. Done. But 
> now we do so much more with this interactive script -- manage mail, play 
> games -- JavaScript needs to have a real compiler too. And as we get into 
> compilation, its eval will get slower and perhaps JS programmers will 
> re-learn what Lispers learned. 
> 
> But this won't be the end. I predict that in 20 years some other language 
> will re-invent eval and it will resume from there. 
> 
> CS, the science of reinvention. 
> 
> 
> 
> 
> 
> On Jul 19, 2012, at 3:46 AM, Eli Barzilay wrote:
> 
>> Just now, John Clements wrote:
>>> 
>>> I don't think you should be shocked; I believe that calls to eval
>>> are essentially triggering full passes of the parser and compiler,
>>> dynamically. It's true that you could optimize for certain special
>>> cases (such as yours), but generally speaking these use cases are
>>> rare, particularly since I'm guessing that the places where this
>>> optimization would be possible are also the places where eval isn't
>>> needed.
>> 
>> As a sidenote, this is not something that is unique to racket or that
>> is new in any way...  I first "encountered" this in 1995 in a project
>> written in Allegro Lisp -- I was surprised about how slow `eval' was,
>> and when I asked about it, the advice I was given is that in extreme
>> cases where you really need a fast evaluation of dynamically generated
>> code, you're better off writing a mini-evaluator instead.
>> 
>> (Another sidenote: there are some languages with a "very fast" eval,
>> like elisp and newlisp.  In these languages it can be as fast as
>> running normal code, but this is because there is little to no
>> compilation done.)
>> 
>> -- 
>>         ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
>>                   http://barzilay.org/                   Maze is Life!
>> ____________________
>> Racket Users list:
>> http://lists.racket-lang.org/users
> 
> 
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to