如何在Java中创建函数Repl

如何在Java中创建函数Repl,java,user-input,prompt,Java,User Input,Prompt,这是Peter Norvig的repl函数: 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

这是Peter Norvig的repl函数:

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)
有效的方法是:

>>> 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> 

我试图用Java编写具有相同功能的程序,尝试了Java文档中的类,但没有一个能像这样工作;有什么想法吗?谢谢。

一个REPL被称为REPL,因为它是一个Loop,负责Reads和E评估代码并p打印结果。在Lisp中,代码字面上是:

(LOOP (PRINT (EVAL (READ))))
在非结构化语言中,它类似于:

#loop:
$code ← READ;
$res  ← EVAL($code);
        PRINT($res);
  GOTO #loop;
while (true) {
  Code code  = read(System.in);
  Object res = eval(code);
  System.out.println(res);
}
这就是这个名字的由来

在Java中,它类似于:

#loop:
$code ← READ;
$res  ← EVAL($code);
        PRINT($res);
  GOTO #loop;
while (true) {
  Code code  = read(System.in);
  Object res = eval(code);
  System.out.println(res);
}

但是,在Java或JRE中没有对应于
READ
EVAL
的方法。您必须自己编写
read
eval
,以及
code
。请注意,
read
本质上是Java的解析器,
eval
是Java的解释器。Java语言规范中描述了Java的语法和语义,您只需阅读JLS并实现这两种方法。

下载Java 9。Java没有一个或
eval()
方法,即使有,它也肯定不会计算非Java代码。@Andreascough@ElliottFrisch是的,它有自己的回复:Groovy或GroovyConsole可以很好地做到这一点。我不需要javarepl,我只希望我的提示符看起来像python的:input(“something”)函数。