我正在Rust中创建一个小的ncurses应用程序,需要与子进程通信.我已经有了一个用Common Lisp编写的原型; 这里的gif 将有希望展示我想做的事情.我正在尝试重写它,因为CL为这么小的工具使用了大量的内存.
我之前没有使用过Rust(或其他低级语言),而且我在弄清楚如何与子进程交互时遇到了一些麻烦.
我目前正在做的大致是这样的:
创建流程:
let mut program = match Command::new(command)
.args(arguments)
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.spawn()
{
Ok(child) => child,
Err(_) => {
println!("Cannot run program '{}'.", command);
return;
}
};
Run Code Online (Sandbox Code Playgroud)将它传递给无限(直到用户退出)循环,该循环读取并处理输入并像这样监听输出(并将其写入屏幕):
fn listen_for_output(program: &mut Child, output_viewer: &TextViewer) {
match program.stdout {
Some(ref mut out) => {
let mut buf_string = String::new();
match out.read_to_string(&mut buf_string) {
Ok(_) => output_viewer.append_string(buf_string),
Err(_) => return,
};
}
None => return,
};
}
Run Code Online (Sandbox Code Playgroud)read_to_string然而,调用阻止程序直到进程退出.从我所看到的read_to_end,read似乎也阻止.如果我尝试运行类似于ls哪个退出的东西,它可以工作,但是有些东西不能退出, …
是否有办法以类似于此的方式将属性列表作为参数传递给函数:
(defun sum (&key x y) (+ x y))
(sum '(:x 10 :y 20))
Run Code Online (Sandbox Code Playgroud) 我的任务是使用宏 do-primes计算a和b之间所有素数的列表,然后使用自定义代码打印它们.
说(do-primes(n 5 15)(鲜线)(princ n))应该打印4行:
这是我的代码:
(defun is-prime (n &optional (d (- n 1)))
(or (= d 1)
(and (/= (rem n d) 0)
(is-prime n (- d 1)))))
(defun my-func (a b)
(let (lst '())
(loop for i from a to b do
(if (is-prime i)
(push i lst)
)
)
(reverse lst))
)
(defmacro do-primes ((var startv endv) &body body)
`(my-func ,startv ,endv) `(,@body)
) …Run Code Online (Sandbox Code Playgroud)