Skip to content

Commit eb8c640

Browse files
committed
generator sample
1 parent fcd564a commit eb8c640

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

examples/generator.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use rustpython_vm as vm;
2+
use vm::{
3+
builtins::PyIntRef,
4+
protocol::{PyIter, PyIterReturn},
5+
Interpreter, PyResult,
6+
};
7+
8+
fn py_main(interp: &Interpreter) -> vm::PyResult<()> {
9+
let generator = interp.enter(|vm| {
10+
let scope = vm.new_scope_with_builtins();
11+
let _ = vm.run_code_string(
12+
scope.clone(),
13+
r#"
14+
def gen():
15+
for i in range(10):
16+
yield i
17+
18+
generator = gen()
19+
"#,
20+
"".to_owned(),
21+
)?;
22+
let generator = scope.globals.get_item("generator", vm)?;
23+
Ok(generator)
24+
})?;
25+
26+
loop {
27+
let r = interp.enter(|vm| {
28+
let v = match PyIter::new(generator.clone()).next(vm)? {
29+
PyIterReturn::Return(obj) => {
30+
PyIterReturn::Return(obj.try_into_value::<PyIntRef>(vm)?)
31+
}
32+
PyIterReturn::StopIteration(x) => PyIterReturn::StopIteration(x),
33+
};
34+
PyResult::Ok(v)
35+
})?;
36+
match r {
37+
PyIterReturn::Return(value) => println!("{}", value),
38+
PyIterReturn::StopIteration(_) => break,
39+
}
40+
}
41+
42+
Ok(())
43+
}
44+
45+
fn main() {
46+
let interp = vm::Interpreter::with_init(Default::default(), |vm| {
47+
vm.add_native_modules(rustpython_stdlib::get_module_inits());
48+
});
49+
let result = py_main(&interp);
50+
std::process::exit(interp.run(|_vm| result));
51+
}

0 commit comments

Comments
 (0)