Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Simple REPL madness.

by pobocks (Chaplain)
on Dec 22, 2008 at 06:48 UTC ( [id://731978]=perlmeditation: print w/replies, xml ) Need Help??

So, I was just poking around with the Perl interpreter , manually satisfying my curiosity about how Perl handles the DATA and END filehandles and their respective (Markers? Constants?) if called from the shell.

I noticed that, __DATA__ is interesting, because it's handled line by line, as you type. So, by combining that with some stupidly insecure and terrible eval magic, I now present the simplest, stupidest REPL ever made by mortal hands.

First, type "perl <enter>" into the shell.

while (<DATA>){ if ($_ eq "!\n"){ eval $string;$string = '';print "\n";} else { $string .= $_; } } __DATA__ #REPL behavior starts here!

I don't imagine this has any use other than exhibiting my madness to the world, but I found it an interesting misuse of the language.

This particular code maintains local variables through code chunks, but not across differing evals; my original code went statement by statement. I can't figure out how to golf this down while maintaining the ability to handle code blocks that go across multiple lines, nor have I thus far figured out how to maintain local variables across the evals.

for(split(" ","tsuJ rehtonA lreP rekcaH")){print reverse . " "}print "\b.\n";

Replies are listed 'Best First'.
Re: Simple REPL madness.
by CountZero (Bishop) on Dec 22, 2008 at 07:12 UTC
    Wouldn't it be much easier to just delete all code above (and including) the __DATA__ marker and run what remains?

    CountZero

    A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

      That would not run each line as it is typed. That would also let lexical scopes work, and make a number of other differences.

        Correct, although I feel it's worth pointing out that this code actually checks for a sentinel value (a bang on a line of its own) rather than evaluating each expression as entered.

        Also, I just realized, in order to be a proper REPL, it really should be print eval ...

        for(split(" ","tsuJ rehtonA lreP rekcaH")){print reverse . " "}print "\b.\n";

      What he said ::points at tilly's comment::

      The interesting (for some values of interesting) part of this is the immediate interpretation. Of course, there's a much more functional Read-Eval-Print-Loop available at perl -d. But I found it interesting from a "oooh, lookie what weirdness the DATA handle can be used for" perspective.

      for(split(" ","tsuJ rehtonA lreP rekcaH")){print reverse . " "}print "\b.\n";
        Thank you for eventually explaining what the *bleep* a 'REPL' is.

        --
        In Bob We Trust, All Others Bring Data.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlmeditation [id://731978]
Front-paged by ysth
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (5)
As of 2024-04-18 01:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found