红色:***错误:单词没有价值!调用外部库函数时

时间:2015-01-15 09:05:29

标签: 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块之后保留相同的值。

2 个答案:

答案 0 :(得分:5)

请记住,您正在阅读Red / System(类C语言)规范,而不是Red规范,因此#import必须在Red / System中完成。几个笔记:

  1. 如果您想在Red中引用Red / System,有几种方法:
  2. 使用导入

    创建单独的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. 存在已存在的here SDL1绑定。但是,也存在来自其他绑定的依赖关系。我有mirror of all those fossil bindings(几天前更新)。

答案 1 :(得分:5)

您所引用的文件是红色/系统规格,不包括红色。您实际上已经编写了一个Red / System程序。 (除了使用Red []标题)。如果您编译并运行它,它应该按预期执行。

如果要从Red访问外部库,则需要使用例程!,一个从Red调用的Red / System函数。如果你只是在Red和外部函数之间传递整数值,它是非常直接的,因为整数值是自动" marshalled"红色和红色之间/系统。 (其他数据类型不是这种情况)。

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