Показаны сообщения с ярлыком fp. Показать все сообщения
Показаны сообщения с ярлыком fp. Показать все сообщения

2013-04-15

Немножко извращений с Objective C

1. Ехал лямбда через лямбда... 
Реальный код, убрал несущественное...
- (void) processItems:(NSDictionary *) items
                using:(void (^)(Item * item)) processor
{
    [self runBlock:^() {
        NSError * error = [self catchNSError:^() {
            [items enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
                [obj enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                    processor(obj);                                        
                }];
            }];
        }];
    }];
}

2. Типизированные коллекции в Obj-C
NSArray/*<NSString*>*/ * strings = ...
NSDictionary/*<NSString*,NSString*>*/ * dict = ...

2013-01-24

сишники узнали о for_each

Из одной библиотеки (на которую я уже жаловался)

typedef void (* clist_func)(void *, void *);
void clist_foreach(clist * lst, clist_func func, void * data) {
  clistiter * cur;
  for(cur = clist_begin(lst) ; cur != NULL ; cur = cur->next)
    func(cur->data, data);
}

//....

clist_foreach(list, (clist_func)free, NULL);

Если кто забыл -- void free(void*). То есть, имеем UB по стандарту С. Да, оно работает, пока cdecl и компилятор не намудрит с оптимизацией.

Интересный факт: так как это UB, компилятор имеет право делать все, что угодно. Prerelease GCC 4.3, если типы функций были несовместимы, возвращал NULL. К релизу пришлось поменять назад, ибо дофига софта "поломалось".

2012-08-31

Элементы ФП в ObjC (BlocksKit)

Когда-то жаловался, что ObjC у массива нету поиска по условию.
Нашел фреймворк, который позволяет писать на ObjC "функциональненько".
3 типа map (each:, apply:, map:), filter (select:, reject:), find(match:), any, all, none, fold (reduce:withBlock:). Плюс in-place варианты для мутабельных коллекций (performMap:, performSelect:, performReject:). Все принимают блок (ака лямбда).
Имхо, эта штука должна быть в ObjC "искаропки".