在 GNUStep 中使用 Objective-C Lambda 语法
Using Objective-C Lambda syntax with GNUStep
Objective-C 有一个类似 Lambda 的语法,称为 Blocks,由 Clang 引入,但它需要运行时支持。如果我的环境是 GNUStep 而不是 Apple 的运行时,我该如何使用它?
要测试的简单代码 运行 (t.m):
#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
Objective-C 有一个类似 Lambda 的语法,称为 Blocks,由 Clang 引入,但它需要运行时支持。如果我的环境是 GNUStep 而不是 Apple 的运行时,我该如何使用它?
要测试的简单代码 运行 (t.m):
#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