我正在关注此处红色文档中的示例:http://static.red-lang.org/red-system-specs.html#section-14
这是我的代码:
Red []
#import [
"SDL2.dll" cdecl [
sdl_init: "SDL_Init" [
flags [integer!]
return: [integer!]
]
]
]
rc: sdl_init 0
当我使用Red解释器执行此操作时,我在最后一行收到以下错误:
*** Error: word has no value!
*** Error: word has no value!
使用red -c
进行编译会产生更有用的错误:
*** Compilation Error: undefined word sdl_init
*** in file: %/C/temp/red/sdl.red
*** near: [sdl_init 0]
显然,在导入库期间定义的sdl_init
在到达最后一行时超出了范围。
您如何解释文档中的示例呢?如果我在导入之前将sdl_init
初始化为某个任意值,它仍会在#import
块之后保留相同的值。
答案 0 :(得分:5)
请记住,您正在阅读Red / System(类C语言)规范,而不是Red规范,因此#import
必须在Red / System中完成。几个笔记:
使用导入
创建单独的SDL2.reds脚本Red/System []
sdl: context [
#import [
"SDL2.dll" cdecl [
sdl_init: "SDL_Init" [
flags [integer!]
return: [integer!]
]
]
]
]
rc: sdl_init 0
要在红色中使用它,请在脚本中使用#include %SDL2.reds
,然后您可以创建例程
#include %SDL2.reds
initialize: routine ["SDL Initialize" ][
with sdl [sdl_init 0]
]
或者您可以使用指令:#system-global []
或#system []
- 我不知道这是使用#import
的好主意,但您可以调用SDL2。红色功能在其中。
#include %SDL2.reds
#system [with sdl [sdl_init 0]]
答案 1 :(得分:5)
您所引用的文件是红色/系统规格,不包括红色。您实际上已经编写了一个Red / System程序。 (除了使用Red []标题)。如果您编译并运行它,它应该按预期执行。
如果要从Red访问外部库,则需要使用例程!,一个从Red调用的Red / System函数。如果你只是在Red和外部函数之间传递整数值,它是非常直接的,因为整数值是自动" marshalled"红色和红色之间/系统。 (其他数据类型不是这种情况)。
包含路线的红色程序!需要编译,在此阶段无法从Red控制台运行。一旦Red编译器是自托管的(Red 2.0),就应该有一个即时编译器,这样你就可以在Red控制台中运行这样的代码了。