user6713148
user6713148

Reputation:

How To Create Function Repl in Java

This is a Peter Norvig's repl function:

def repl(prompt='lis.py> '):
    "A prompt-read-eval-print loop."
    while True:
        val = eval(parse(raw_input(prompt)))
        if val is not None: 
            print(schemestr(val))

def schemestr(exp):
    "Convert a Python object back into a Scheme-readable string."
    if isinstance(exp, List):
        return '(' + ' '.join(map(schemestr, exp)) + ')' 
    else:
        return str(exp)

Which works:

>>> repl()
lis.py> (define r 10)
lis.py> (* pi (* r r))
314.159265359
lis.py> (if (> (* 11 11) 120) (* 7 6) oops)
42
lis.py> 

I'm trying to write program with the same functionality in Java, tried classes from Java docs, but nothing works like that; any idea? Thanks.

Upvotes: 0

Views: 1706

Answers (1)

Jörg W Mittag
Jörg W Mittag

Reputation: 369468

A REPL is called REPL because it is a Loop that Reads and Evaluates code and Prints the results. In Lisp, the code is literally:

(LOOP (PRINT (EVAL (READ))))

In an unstructured language, it would be something like:

#loop:
$code ← READ;
$res  ← EVAL($code);
        PRINT($res);
  GOTO #loop;

That's where the name comes from.

In Java, it would be something like:

while (true) {
  Code code  = read(System.in);
  Object res = eval(code);
  System.out.println(res);
}

But, there are no methods corresponding to READ or EVAL in Java or the JRE. You will have to write read, eval, and Code yourself. Note that read is essentially a parser for Java, and eval is an interpreter for Java. Both the syntax and the semantics for Java are described in the Java Language Specification, all you have to do is read the JLS and implement those two methods.

Upvotes: 1

Related Questions