| int (^myBlock)(int) = ^(int num) { |
| return num * multiplier; |
| }; |
| // for comparison |
| int (*fcnptr)(int); |
| |
| int d = i % 10; |
| repeat(10, ^{ putc('0' + d); |
| }); |
| |
| |
| void (^block)(void); |
| typedef void (^vstr_t)(char *); |
| typedef void (^workBlk_t)(void); |
| |
| void AllLinesInFile(char *f, vstr_t block) |
| { |
| FILE *fp = fopen(f, "r"); |
| |
| if (!fp) |
| { |
| return; |
| } |
| char line[1024]; |
| while (fgets(line, 1024, fp)) |
| { |
| block(line); |
| } |
| fclose(fp); |
| } |
| |
| |
| @implementation NSArray (WWDC) |
| -(NSArray *)map: (id (^)(id)) xform |
| { |
| id result = [NSMutableArray array]; |
| |
| for (id elem in self) |
| { |
| [result addObject: xform(elem)]; |
| } |
| return result; |
| } |
| |
| -(NSArray *)collect: (BOOL (^)(id)) predicate |
| { |
| id result = [NSMutableArray array]; |
| |
| for (id elem in self) |
| { |
| if (predicate(elem)) |
| { |
| [result addObject: elem]; |
| } |
| } |
| return result; |
| } |
| |
| // corner case: block literal in use with return type |
| id longLines = [allLines collect: ^BOOL (id item) { |
| return [item length] > 20; |
| }]; |
| |
| // corner case: block literal in use with return type |
| id longLines = [allLines collect: ^BOOL *(id item) { |
| return [item length] > 20; |
| }]; |
| |
| @end |
| |
| // 1. block literal: ^{ ... }; |
| // 2. block declaration: return_t (^name) (int arg1, int arg2, ...) NB: return_t is optional and name is also optional |
| // 3. block inline call ^ return_t (int arg) { ... }; NB: return_t is optional |