0

我继续学习红色/系统。现在我正在尝试了解如何通过上下文传递单词以发挥作用。

这是我的代码:

Red [Note: "compile in release mode (-r flag)"]

mycontext: context [
    list: []
]

foo: routine [
    blk 
    /local        
    int [integer!]
    str [c-string!]
][
    blk: as red-block! _context/get-any <CONTEXTHERE> symbol/make "list" ; ?? <CONTEXTHERE>
    int: 123
    str: "Hello"

    block/rs-append blk as red-value! integer/box int
    string/load-in str length? str blk UTF-8
]

foo mycontext ; passing context to foo
probe mycontext

此代码不起作用,因为列表放置在mycontext. list可以在此处找到无上下文传递的示例

我尝试了不同的方法,但每次都出错。

https://github.com/red/red/blob/master/runtime/datatypes/structures.reds#L188

4

1 回答 1

2

首先,您的例程的类型规范不正确(这就是错误消息告诉您的内容):

Compiling to native code...
*** Compilation Error: invalid definition for function exec/foo: [
    blk [red-red-block!]
    /local
    int [integer!]
    str [c-string!]
]

编译器自动red-*为例程的参数添加前缀,因此正确的规范应该是:

foo: routine [
    blk [block!]
    /local        
        int [integer!]
        str [c-string!]
][
    ...
]

其次,这也不正确;你正在传递一个object!,而不是一个block!

*** Compilation Error: datatype not allowed

这意味着应该写:

foo: routine [
    obj [object!]
    /local        
        int [integer!]
        str [c-string!]
][
    ...
]

现在,据我了解,您想要获取所引用的空块list并向其附加值。这需要有一个上下文节点

obj/ctx

和符号 ID

symbol/make "list"

有两个就位,我们可以拨打电话_context/get-any

foo: routine [
    obj [object!]
    /local
        blk [red-block!]
        int [integer!]
        str [c-string!]
][
    blk: as red-block! _context/get-any symbol/make "list" obj/ctx
    int: 123
    str: "Hello"

    block/rs-append blk as red-value! integer/box int
    string/load-in str length? str blk UTF-8
]

替代解决方案是使用和调用构造一个word!值:word/loadobject/rs-select

foo: routine [
    obj [object!]
    /local
        blk [red-block!]
        int [integer!]
        str [c-string!]
][
    blk: as red-block! object/rs-select obj as red-value! word/load "list"
    int: 123
    str: "Hello"

    block/rs-append blk as red-value! integer/box int
    string/load-in str length? str blk UTF-8
]

两种方法都会产生预期的结果:

make object! [
    list: [123 "Hello"]
]

就个人而言,我不会让事情复杂化,只需将块传递给您的例程:

mycontext: context [
    list: []
]

foo: routine [
    blk [block!]
    /local
        int [red-integer!]
        str [c-string!]
][
    str: "Hello"
    int: as red-integer! stack/push*
    int/header: TYPE_INTEGER
    int/value: 123

    block/rs-append blk as red-value! int
    string/load-in str length? str blk UTF-8
]

foo mycontext/list
probe mycontext
于 2020-06-17T12:16:12.037 回答