标签: read-eval-print-loop

如何在应用程序中嵌入图形交互式IronPython shell?

我在我的宠物开源项目RevitPythonShell(建筑建模软件Autodesk Revit Architecture 2010的插件)中尝试了明显的路径:code.interact()使用IronPython引擎设置为STDIN和使用.NET流STDOUT.然后我将这些重定向到TextBox控件.它有点工作,但真的只是一个丑陋的黑客.

主要问题是让所有shell工作正常工作:历史记录的上箭头和下箭头,编辑,复制和粘贴,EOF,语法高亮,工具提示等.要做到这一点需要做很多工作,而且它并不是我想要解决的问题(我正在尝试在Revit中托管交互式shell,而不是制作完美的shell GUI).

如果这不是一个.NET项目,我可能会考虑重用PyCrust/PyWrap,但我不确定是否可以从WinForms项目中完成..NET有什么类似的东西吗?

有没有人实现过IConsole界面,可以展示我需要做什么的例子?看起来这将是正确的路线(而不是使用code模块),但对于我的生活,我无法弄明白.IronPython源代码没有任何评论.

更新:在尝试了一些东西后,我最终选择了精湛的IronLab代码.它包括一个带语法高亮的示例shell和all.代码很好,易于集成.检查有关如何嵌入它的提示的RevitPythonShell代码.

python shell ironpython embedding read-eval-print-loop

10
推荐指数
1
解决办法
4024
查看次数

以编程方式启动Scala REPL?

我想从命令行启动Scala Swing应用程序,然后在应用程序启动后,放入Scala REPL以用作控制接口.

理想情况下,我还想预先绑定一些变量名称.更好的是为REPL使用Java2D终端仿真器,但我找不到合适的东西.

Scala REPL是否有公共API?

scala read-eval-print-loop

10
推荐指数
1
解决办法
3740
查看次数

是否有与pdl2(或Devel :: REPL)中的perl调试器'x'等效的?

我正在使用pdl2(PDLshell)作为我的默认Perl交互式shell(它加载所有漂亮的插件Devel::REPL).但我错过了x自卸车打印别名.p很适合piddles但它不适用于普通的数组引用或散列引用.我已经加载Data::Dumper但它缺乏一种简单的控制深度的方法,我喜欢你可以快速设置深度限制的方式x,例如x 2 $deep_datastruct复杂的数据结构.但随着Data::Dumper这个过程更加繁琐:

pdl> say $c
HASH(0x53b0b60)

pdl> p $c
HASH(0x12b14018)

pdl> use Data::Dumper

pdl> p Dumper $c
$VAR1 = {
          'c' => {
                   'c' => 3,
                   'a' => 1,
                   'b' => {
                            'c' => '3',
                            'a' => '1',
                            'b' => '2'
                          }
                 },
          'a' => 1,
          'b' => 4
        };
pdl>  $Data::Dumper::Maxdepth = 1;
pdl> p Dumper $c
$VAR1 = { …
Run Code Online (Sandbox Code Playgroud)

perl pdl read-eval-print-loop

10
推荐指数
1
解决办法
388
查看次数

有没有比在交互模式下运行更好的PHP控制台

是否有像PHP的?语法突出显示并且在第一个异常时没有控制台退出到shell将是很好的.:)

php console read-eval-print-loop

10
推荐指数
2
解决办法
2416
查看次数

使用Flex/Bison进行口译的REPL

我为类似C语言编写了一个解释器,使用Flex和Bison作为扫描器/解析器.它在执行完整的程序文件时工作正常.

现在我正在尝试在解释器中实现REPL以进行交互式使用.我希望它像Ruby或ML中的命令行解释器一样工作:

  1. 显示提示
  2. 接受该行的一个或多个陈述
  3. 如果表达式不完整
    1. 显示继续提示
    2. 允许用户继续输入行
  4. 当该行以完整表达结束时
    1. 回显评估最后一个表达式的结果
    2. 显示主要提示

我的语法从一个top_level生产开始,它代表了该语言中的一个语句.词法分析器配置为stdin上的交互模式.我在全文件和REPL模式下使用相同的扫描器和语法,因为两个接口没有语义差异.

我的主要评估循环是这样构建的.

while (!interpreter.done) {
    if (interpreter.repl)
        printf(prompt);
    int status = yyparse(interpreter);
    if (status) {
        if (interpreter.error)
            report_error(interpreter);
    }
    else {
        if (interpreter.repl)
            puts(interpreter.result);
    }
}            
Run Code Online (Sandbox Code Playgroud)

除了提示和回显逻辑之外,这种方法很好.如果用户在一行上输入多个语句,则此循环将打印出多余的提示和表达式.如果表达式在多行上继续,则此代码不会打印出连续提示.出现这些问题是因为提示/回显逻辑的粒度是top_level语法中的一个语句,但是行读取逻辑在词法分析器中很深.

重构评估循环以处理REPL提示和回显的最佳方法是什么?那是:

  • 如何每行显示一个提示
  • 如何在正确的时间显示延续提示
  • 如何判断完整表达式何时是一行中的最后一个表达式

(我宁愿不改变扫描仪语言来传递换行标记,因为这会严重改变语法.修改YY_INPUT和添加一些动作到Bison语法会很好.而且,我使用的是Flex 2.5.35和与Xcode一起发货的Bison 2.3.)

c lex bison read-eval-print-loop flex-lexer

10
推荐指数
1
解决办法
1904
查看次数

在Haskell中处理UserInterrupt异常

我正在为Haskell中的Scheme解释器实现一个REPL,我想处理一些像UserInterrupt,StackOverflow,HeapOverflow等异步事件......基本上,我想在UserInterrupt发生时停止当前的计算并打印一个StackOverflow和HeapOverflow发生时的合适消息等.我实现如下:

    repl evaluator = forever $ (do
        putStr ">>> " >> hFlush stdout
        out <- getLine >>= evaluator
        if null out
           then return ()
           else putStrLn out)
        `catch`
        onUserInterrupt

    onUserInterrupt UserInterrupt = putStrLn "\nUserInterruption"
    onUserInterrupt e = throw e

    main = do
        interpreter <- getMyLispInterpreter
        handle onAbort (repl $ interpreter "stdin")
        putStrLn "Exiting..."

    onAbort e = do
        let x = show (e :: SomeException)
        putStrLn $ "\nAborted: " ++ x
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但有一个例外.如果我启动解释器并按Ctrl-Z + Enter,我会得到:

    >>> ^Z

    Aborted: <stdin>: hGetLine: end of …
Run Code Online (Sandbox Code Playgroud)

haskell exception-handling exception interruption read-eval-print-loop

10
推荐指数
1
解决办法
1457
查看次数

Vim:在持久的REPL环境中运行选定的代码

R,Python,Scala等都带有REPL环境,我不想错过,但是,大多数时候编辑它们的文本很糟糕,所以我在vim中编辑代码,粘贴它并查看输出并再次编辑vim中的代码.

我可以运行当前文件,!python %我可以用更多的vim魔法运行当前行,但是,这将启动解释器的新进程.

是否可以启动REPL并向正在运行的REPL发送代码行(显然可以得到结果)?

vim read-eval-print-loop

10
推荐指数
1
解决办法
2802
查看次数

REPL/interactive shell是否支持PHP 5.3?

我一直在使用phpsh一段时间了,过去它运行得很好.但它的命名空间支持仍然不是很好,这可能非常令人沮丧.

\Somespace\Someclass::someStaticFunction()在没有禁用检查是否存在方法的情况下,这样做是行不通的,这会导致重置环境的拼写错误导致频繁的致命错误.

有多个PHP REPL,包括PHP内置shell(php -a),使用起来很糟糕.

有没有人知道一个替代方案或者一个具有正确名称空间支持的phpsh-fork?或者也许是一个简单的配置修复我忽略了......


一个例子:

这个测试文件:

<?
namespace testing;

function echoSome(){
        echo 'Something';
}

\testing\echoSome();
Run Code Online (Sandbox Code Playgroud)

在phpsh中生成此输出(如预期的那样)

php> include '/path/test.php';
Something
php>
Run Code Online (Sandbox Code Playgroud)

但是再次尝试相同的调用不起作用:

php> \testing\echoSome();
Not executing input: Possible call to undefined function echoSome()
See /etc/phpsh/config.sample to disable UndefinedFunctionCheck.
Run Code Online (Sandbox Code Playgroud)

没有命名空间,该功能仍然可用:

<?
function echoSome(){
        echo 'Something';
}

echoSome();
Run Code Online (Sandbox Code Playgroud)

在phpsh中:

php> include '/path/test.php';
Something
Run Code Online (Sandbox Code Playgroud)

电话仍然有效:

php> echoSome();
Something
Run Code Online (Sandbox Code Playgroud)

php shell read-eval-print-loop phpsh

10
推荐指数
1
解决办法
1069
查看次数

Sublime Text 3 REPL - 在同一个REPL窗口中打开程序

我会明白这一点.我已经通过Package Control安装了SublimeREPL,而且我已经根据需要设置了它.

唯一困扰我的是,每次我构建一个python脚本(CTRL + B)时,都会打开一个新的REPL窗口,即使我已经打开了一个.

有没有办法配置REPL在已打开的REPL窗口中打开新版本?

这是一个例子

python read-eval-print-loop sublimetext3

10
推荐指数
1
解决办法
623
查看次数

是否可以使用c#"交互式窗口"而不是VS2017中的即时窗口

C#" 交互式 窗口 "比" 即时 窗口 " 功能更全面.是否可以在调试会话期间将调试上下文加载到其中?

c# debugging read-eval-print-loop visual-studio-2017

10
推荐指数
1
解决办法
1630
查看次数