Использование лямбда-синтаксиса Objective-C с GNUStep
Objective-C имеет лямбда-подобный синтаксис под названием Blocks, который был представлен Clang, но он требует поддержки во время выполнения. Как я могу использовать его, когда моя среда GNUStep вместо времени выполнения Apple?
1 ответ
Решение
Простой код для тестирования и запуска (тм):
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSException.h>
#import <Foundation/NSDebug.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <Foundation/NSObjCRuntime.h>
#include <string.h>
#if defined(GNUSTEP)
#import <GNUstepBase/GSObjCRuntime.h>
#else
#include <objc/runtime.h>
#endif
void test(void (^callback)(void))
{
callback();
}
int main(int argc, char *argv[])
{
@autoreleasepool
{
int multiplier = 7;
int (^myBlock)(int) = ^(int num)
{
return num * multiplier;
};
NSLog(@"%d", myBlock(3));
test(^(void)
{
NSLog(@"Inside");
});
NSLog(@"BLAH");
}
return 0;
}
Проверено на Ubuntu 16
Установка:
apt-get install -y build-essential gobjc gobjc++ gnustep gnustep-devel libgnustep-base-dev clang gnustep-make llvm libblocksruntime-dev
Обобщение:
clang -I `gnustep-config --variable=GNUSTEP_SYSTEM_HEADERS` -L `gnustep-config --variable=GNUSTEP_SYSTEM_LIBRARIES` -lgnustep-base -fconstant-string-class=NSConstantString -D_NATIVE_OBJC_EXCEPTIONS -fblocks -lobjc -o t t.m -lBlocksRuntime
Бежать:
./t
Если вам не хватает objc/runtime.h
скачать и распаковать GNUStep libobjc:
wget http://download.gna.org/gnustep/libobjc2-1.6.tar.gz
tar xzvf libobjc2-1.6.tar.gz
cp -r libobjc2-1.6/objc /usr/include/GNUstep