【问题标题】:How To Create Function Repl in Java如何在 Java 中创建函数 Repl
【发布时间】:2017-06-09 23:04:28
【问题描述】:

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

【问题讨论】:

  • 下载java 9。它叫JShell。
  • Java 没有 REPLeval() 方法,即使有,它也肯定不会评估非 Java 代码。
  • @Andreas 咳嗽 jython 咳嗽
  • @ElliottFrisch 是的,它带有自己的 REPL:jython.org/docs/using/cmdline.html#command-line
  • Groovy 或 GroovyConsole 都可以搞定

标签: java user-input prompt


【解决方案1】:

REPL 之所以称为 REPL,是因为它是一个 Loop,R读取并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 并实现这两个方法。

【讨论】:

  • 同意上面所说的一切。我不需要 Java repl,我只希望我的提示符看起来像 python 的:input("something") 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2017-01-25
  • 2018-08-03
  • 1970-01-01
  • 2022-10-12
  • 2022-08-16
  • 2019-01-27
相关资源
最近更新 更多