4

我在这里遵循红色文档中的示例: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块之后仍然保留相同的值。

4

2 回答 2

5

请记住,您正在阅读 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 绑定。不过,也有来自其他绑定的依赖项。我有所有这些化石绑定的镜子(几天前更新)。
于 2015-01-15T13:54:27.540 回答
5

您所指的文档是 Red/System 规范,不包括 Red。您实际上已经编写了一个 Red/System 程序。(除了使用 Red[] 标头之外)。如果您编译并运行它,它应该按您的预期执行。

如果你想从 Red 访问一个外部库,你需要使用一个例程!,一个从 Red 调用的 Red/System 函数。如果您只在 Red 和外部函数之间传递整数值,那么它非常简单,因为整数值会在 Red 和 Red/System 之间自动“编组”。(其他数据类型不是这种情况)。

一个包含例程的红色程序!需要编译,现阶段无法从 Red 控制台运行。一旦 Red 编译器自托管(Red 2.0),就应该有一个即时编译器,这样您就可以在 Red 控制台中运行此类代码。

于 2015-01-15T13:57:11.030 回答