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 中完成。一些注意事项:

  1. 如果你想在 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]]
  1. 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 控制台中 运行 这样的代码。