Как я могу скомпилировать скрипт, который имеет некоторый динамический код? - PullRequest
1 голос
/ 16 октября 2019

Я хочу скомпилировать этот скрипт:

Red [File: %b.red]
context [
    a: 123
    hidden: 999
    set 'global-exports context [
        export-a: a
    ]
]
probe global-exports

Но я получаю ошибку при попытке скомпилировать его с $ ./red-13oct19-a4ee537c -r b.red:

*** Red Compiler Internal Error: Script Error : Invalid path value: global-exports 
*** Where: register-object 
*** Near:  [objects/context/global-exports: make object! [
a: none
hidden: none
]] 

1 Ответ

1 голос
/ 16 октября 2019

В общем случае динамический код можно обернуть с помощью функции do [...], которая обрабатывает блок кода как данные и использует интерпретатор для его запуска во время выполнения:

Red [File: %b.red]
context [
    a: 123
    hidden: 999
    do [   ;-- the code inside is run by interpreter at runtime
        set 'global-exports context [
            export-a: a
        ]
    ]
]
probe get 'global-exports   ;-- dynamic retrieval

Вы также должны получить значениядинамически, если вы не инициализируете его статически (например, global-exports: none) где-то ранее.

В этом конкретном случае также будет достаточно заменить context на make object!:

Red [File: %b.red]
context [
    a: 123
    hidden: 999
    set 'global-exports make object! [
        export-a: a
    ]
]
probe global-exports

Компиляция динамическогокод будет возможен с JIT-компилятором , который планируется в будущем, но не раньше, чем в Red версии 1.0.

(спасибо @ 9214 и @hiiamboris за идеи для red / helpgitter chat )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...