Red: *** Error: word has no value! when calling external library function
Red: *** Error: word has no value! when calling external library function
我在这里遵循红色文档中的示例: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
块之后仍然保留相同的值。
请记住,您正在阅读 Red/System(类 C 语言)规范,而不是 Red 规范,因此 #import
必须在 Red/System 中完成。一些注意事项:
- 如果你想在 Red 中引用 Red/System,有几种方法:
使用导入创建一个单独的 SDL2.reds 脚本,
Red/System []
sdl: context [
#import [
"SDL2.dll" cdecl [
sdl_init: "SDL_Init" [
flags [integer!]
return: [integer!]
]
]
]
]
rc: sdl_init 0
要在Red中使用,在脚本中使用#include %SDL2.reds
,可以套路
#include %SDL2.reds
initialize: routine ["SDL Initialize" ][
with sdl [sdl_init 0]
]
或者您可以使用指令:#system-global []
或 #system []
- 我不知道这是使用 #import
的好主意,但您可以调用 SDL2.reds在其中发挥作用。
#include %SDL2.reds
#system [with sdl [sdl_init 0]]
- SDL1 绑定已经存在here. There are dependencies from other bindings as well though. I have a mirror of all those fossil bindings(几天前更新)。
您参考的文档是 Red/System 规范,不包括 Red。您实际上已经编写了一个 Red/System 程序。 (除了使用了 Red[] header)。如果您编译并 运行 它,它应该按您预期的那样执行。
如果您想从 Red 访问外部库,您需要使用例程!,一个从 Red 调用的 Red/System 函数。如果您只在 Red 和外部函数之间传递整数值,那么它非常简单,因为整数值在 Red 和 Red/System 之间自动 "marshalled"。 (其他数据类型不是这种情况)。
一个包含例程的红色程序!需要编译,现阶段不能从 Red 控制台 运行。一旦 Red 编译器是 self-hosted(Red 2.0),应该有一个 just-in-time 编译器,这样您就可以在 Red 控制台中 运行 这样的代码。
我在这里遵循红色文档中的示例: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
块之后仍然保留相同的值。
请记住,您正在阅读 Red/System(类 C 语言)规范,而不是 Red 规范,因此 #import
必须在 Red/System 中完成。一些注意事项:
- 如果你想在 Red 中引用 Red/System,有几种方法:
使用导入创建一个单独的 SDL2.reds 脚本,
Red/System []
sdl: context [
#import [
"SDL2.dll" cdecl [
sdl_init: "SDL_Init" [
flags [integer!]
return: [integer!]
]
]
]
]
rc: sdl_init 0
要在Red中使用,在脚本中使用#include %SDL2.reds
,可以套路
#include %SDL2.reds
initialize: routine ["SDL Initialize" ][
with sdl [sdl_init 0]
]
或者您可以使用指令:#system-global []
或 #system []
- 我不知道这是使用 #import
的好主意,但您可以调用 SDL2.reds在其中发挥作用。
#include %SDL2.reds
#system [with sdl [sdl_init 0]]
- SDL1 绑定已经存在here. There are dependencies from other bindings as well though. I have a mirror of all those fossil bindings(几天前更新)。
您参考的文档是 Red/System 规范,不包括 Red。您实际上已经编写了一个 Red/System 程序。 (除了使用了 Red[] header)。如果您编译并 运行 它,它应该按您预期的那样执行。
如果您想从 Red 访问外部库,您需要使用例程!,一个从 Red 调用的 Red/System 函数。如果您只在 Red 和外部函数之间传递整数值,那么它非常简单,因为整数值在 Red 和 Red/System 之间自动 "marshalled"。 (其他数据类型不是这种情况)。
一个包含例程的红色程序!需要编译,现阶段不能从 Red 控制台 运行。一旦 Red 编译器是 self-hosted(Red 2.0),应该有一个 just-in-time 编译器,这样您就可以在 Red 控制台中 运行 这样的代码。