如何在Java中创建函数Repl

时间:2017-06-09 23:04:29

标签: java user-input prompt

这是Peter Norvig的复制功能:

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文档中的类,但没有任何类似的工作;任何的想法?感谢。

1 个答案:

答案 0 :(得分:0)

REPL称为REPL,因为它是 L oop, R eads, E 评估代码, P 揭示结果。在Lisp中,代码实际上是:

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

在非结构化语言中,它将类似于:

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

这个名字的来源。

在Java中,它将类似于:

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

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