@@ -267,7 +267,29 @@ fn builtin_exec(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
267
267
vm. run_code_obj ( code_obj, scope)
268
268
}
269
269
270
- // builtin_filter
270
+ fn builtin_filter ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
271
+ arg_check ! ( vm, args, required = [ ( function, None ) , ( iterable, None ) ] ) ;
272
+
273
+ // TODO: process one element at a time from iterators.
274
+ let iterable = vm. extract_elements ( iterable) ?;
275
+
276
+ let mut new_items = vec ! [ ] ;
277
+ for element in iterable {
278
+ // apply function:
279
+ let args = PyFuncArgs {
280
+ args : vec ! [ element. clone( ) ] ,
281
+ kwargs : vec ! [ ] ,
282
+ } ;
283
+ let result = vm. invoke ( function. clone ( ) , args) ?;
284
+ let result = objbool:: boolval ( vm, result) ?;
285
+ if result {
286
+ new_items. push ( element) ;
287
+ }
288
+ }
289
+
290
+ Ok ( vm. ctx . new_list ( new_items) )
291
+ }
292
+
271
293
// builtin_format
272
294
273
295
fn builtin_getattr ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
@@ -581,7 +603,32 @@ fn builtin_sum(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
581
603
}
582
604
583
605
// builtin_vars
584
- // builtin_zip
606
+
607
+ fn builtin_zip ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
608
+ no_kwargs ! ( vm, args) ;
609
+
610
+ // TODO: process one element at a time from iterators.
611
+ let mut iterables = vec ! [ ] ;
612
+ for iterable in args. args . iter ( ) {
613
+ let iterable = vm. extract_elements ( iterable) ?;
614
+ iterables. push ( iterable) ;
615
+ }
616
+
617
+ let minsize: usize = iterables. iter ( ) . map ( |i| i. len ( ) ) . min ( ) . unwrap_or ( 0 ) ;
618
+
619
+ let mut new_items = vec ! [ ] ;
620
+ for i in 0 ..minsize {
621
+ let items = iterables
622
+ . iter ( )
623
+ . map ( |iterable| iterable[ i] . clone ( ) )
624
+ . collect ( ) ;
625
+ let element = vm. ctx . new_tuple ( items) ;
626
+ new_items. push ( element) ;
627
+ }
628
+
629
+ Ok ( vm. ctx . new_list ( new_items) )
630
+ }
631
+
585
632
// builtin___import__
586
633
587
634
pub fn make_module ( ctx : & PyContext ) -> PyObjectRef {
@@ -616,6 +663,7 @@ pub fn make_module(ctx: &PyContext) -> PyObjectRef {
616
663
dict. insert ( String :: from ( "exec" ) , ctx. new_rustfunc ( builtin_exec) ) ;
617
664
dict. insert ( String :: from ( "float" ) , ctx. float_type ( ) ) ;
618
665
dict. insert ( String :: from ( "frozenset" ) , ctx. frozenset_type ( ) ) ;
666
+ dict. insert ( String :: from ( "filter" ) , ctx. new_rustfunc ( builtin_filter) ) ;
619
667
dict. insert ( String :: from ( "getattr" ) , ctx. new_rustfunc ( builtin_getattr) ) ;
620
668
dict. insert ( String :: from ( "hasattr" ) , ctx. new_rustfunc ( builtin_hasattr) ) ;
621
669
dict. insert ( String :: from ( "hash" ) , ctx. new_rustfunc ( builtin_hash) ) ;
@@ -654,6 +702,7 @@ pub fn make_module(ctx: &PyContext) -> PyObjectRef {
654
702
dict. insert ( String :: from ( "super" ) , ctx. super_type ( ) ) ;
655
703
dict. insert ( String :: from ( "tuple" ) , ctx. tuple_type ( ) ) ;
656
704
dict. insert ( String :: from ( "type" ) , ctx. type_type ( ) ) ;
705
+ dict. insert ( String :: from ( "zip" ) , ctx. new_rustfunc ( builtin_zip) ) ;
657
706
658
707
// Exceptions:
659
708
dict. insert (
0 commit comments