我在我的宠物开源项目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代码.
我想从命令行启动Scala Swing应用程序,然后在应用程序启动后,放入Scala REPL以用作控制接口.
理想情况下,我还想预先绑定一些变量名称.更好的是为REPL使用Java2D终端仿真器,但我找不到合适的东西.
Scala REPL是否有公共API?
我正在使用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) 是否有像PHP的ipython?语法突出显示并且在第一个异常时没有控制台退出到shell将是很好的.:)
我为类似C语言编写了一个解释器,使用Flex和Bison作为扫描器/解析器.它在执行完整的程序文件时工作正常.
现在我正在尝试在解释器中实现REPL以进行交互式使用.我希望它像Ruby或ML中的命令行解释器一样工作:
我的语法从一个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.)
我正在为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
R,Python,Scala等都带有REPL环境,我不想错过,但是,大多数时候编辑它们的文本很糟糕,所以我在vim中编辑代码,粘贴它并查看输出并再次编辑vim中的代码.
我可以运行当前文件,!python %我可以用更多的vim魔法运行当前行,但是,这将启动解释器的新进程.
是否可以启动REPL并向正在运行的REPL发送代码行(显然可以得到结果)?
我一直在使用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) 我会明白这一点.我已经通过Package Control安装了SublimeREPL,而且我已经根据需要设置了它.
唯一困扰我的是,每次我构建一个python脚本(CTRL + B)时,都会打开一个新的REPL窗口,即使我已经打开了一个.
有没有办法配置REPL在已打开的REPL窗口中打开新版本?

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