我本质上是在尝试编写一个带有输入和输出的控制台接口,用于嵌入式python脚本.按照这里的说明,我能够捕获标准输出:
Py_Initialize();
PyRun_SimpleString("\
class StdoutCatcher:\n\
def __init__(self):\n\
self.data = ''\n\
def write(self, stuff):\n\
self.data = self.data + stuff\n\
import sys\n\
sys.stdout = StdoutCatcher()");
PyRun_SimpleString("some script");
PyObject *sysmodule;
PyObject *pystdout;
PyObject *pystdoutdata;
char *string;
sysmodule = PyImport_ImportModule("sys");
pystdout = PyObject_GetAttrString(sysmodule, "stdout");
pystdoutdata = PyObject_GetAttrString(pystdout, "data");
stdoutstring = PyString_AsString(pystdoutdata);
Py_Finalize();
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我只收到了标准输出后的脚本运行完毕后,而理想的控制台stdoutstring将更新为Python脚本更新它.有没有办法做到这一点?
另外,我将如何捕获stdin?
如果它有帮助,我正在使用接受Objective-C的编译器.我也有提升库.
我已经找到了问题的标准部分.对于后代,这有效:
static PyObject*
redirection_stdoutredirect(PyObject *self, PyObject *args)
{
const char *string;
if(!PyArg_ParseTuple(args, "s", &string))
return NULL;
//pass string onto somewhere
Py_INCREF(Py_None);
return Py_None;
}
static …Run Code Online (Sandbox Code Playgroud) 说我有以下内容:
import Control.Monad.Random
foo :: IO Float
foo = fmap realToFrac getRandom
Run Code Online (Sandbox Code Playgroud)
GHC正确地抱怨不知道其类型getRandom; 我可以解决这个问题
foo = fmap realToFrac (getRandom :: IO Double)
Run Code Online (Sandbox Code Playgroud)
但是,请考虑我所拥有的情况:
foo :: (Functor m, MonadRandom m) => m Float
foo = fmap realToFrac getRandom
Run Code Online (Sandbox Code Playgroud)
我做不到
foo = fmap realToFrac (getRandom :: m Double)
Run Code Online (Sandbox Code Playgroud)
我必须重复这个MonadRandom约束:
foo = fmap realToFrac (getRandom :: MonadRandom m => m Double)
Run Code Online (Sandbox Code Playgroud)
由于存在大量约束,这将导致大量额外输入.我宁愿不必那样做.我知道我可以使用ScopedTypeVariables:
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.Random
foo :: MonadRandom m => m Float
foo = …Run Code Online (Sandbox Code Playgroud) 假设我想编写一个函数来展平列表,列表列表,列表列表等等.我可以写下面的内容:
{-# LANGUAGE TypeFamilies #-}
class Flattenable a where
type Flattened a
flatten :: a -> Flattened a
instance NotFlattenable a => Flattenable [a] where
type Flattened [a] = [a]
flatten = id
instance Flattenable a => Flattenable [a] where
type Flattened [a] = Flattened a
flatten = concat . map flatten
Run Code Online (Sandbox Code Playgroud)
其中NotFlattenable a一些约束来限制那些a没有的一个实例Flattenable.是NotFlattenable合法的约束吗?我该怎么写呢?(注意,没有NotFlattenable约束会使两个实例重叠)