Как вы используете директиву #call для функции Red со строковыми типами данных в качестве параметров?

Учитывая сценарий, такой как ниже, который еще не компилируется, как я могу использовать #call использовать мою красную функцию из Red/System?

Red []

pff: function [a [string!] ][print a]  

#system [
    #call [pff "hello"]    
]

Существует несоответствие типов. Что нужно сделать, чтобы преобразовать строку в правильный тип данных Red/System?

2 ответа

Решение

Чтобы раскрыть правильный ответ Питера, в данном конкретном случае вам нужно усвоить к-строку как красную строку!, используя string/load, как это:

Red []

pff: function [a [string!] ][print a]  

#system [
    s: "hello"
    hello: string/load s 1 + length? s UTF-8
    #call [pff hello]
]

Заметки:

  • Красные / системные строки пока только в формате ASCII, поэтому вам нужно указать UTF-8 в качестве формата кодировки источника.

  • Вам нужно передать размер c-строки с учетом терминального NUL (отсюда + 1).

Внутренний API не задокументирован, так как он не завершен. Не стесняйтесь спрашивать здесь или на других наших каналах связи, если вам нужна информация об этом.

Вам нужно сделать вызовы к Red Runtime API для выполнения преобразования. API времени выполнения Red еще не задокументирован, поэтому вам нужно либо прочитать код, либо спросить одного из немногих, кто знаком с ним. (Я сделал немного из обоих).

Я написал функцию для преобразования красной строки! к красной / системной c-струне в кодировке UTF-8!, он на github.

Другие вопросы по тегам