Моцарт/Оз: преобразовать строку в функцию

Мне нужно сгенерировать имена объектов, которые я не знаю заранее, чтобы сделать запись.
Запись должна выглядеть так:
record(day1:[...] day2:[...] day3:[...] ...).
Поскольку я не знаю, сколько дней в записи будет содержать, я не могу написать имена функций самостоятельно! Я пробовал несколько вещей:

{For 1 N 1
proc {$ I}
  local 
    Label 
    Day="day"
  in
    ...
    % Label=Day+I 
    % cannot add a list and a number

    % Label={List.append Day {Int.toString I}} 
    % creates the right string, but when trying to make the record: type error

    % Label=dayI 
    % works but produces only "dayI" features, all the same

    % Label=day + I
    % cannot add a feature and a number
    ...
  end
end
}

Затем все метки обрабатываются в списке, чтобы использовать Record.makeTuple.

Есть ли способ создавать динамические функции или манипулировать ими?
На данный момент единственной найденной мной альтернативой является использование строки не как функции, а с парой: record("day1"#[..] "day2"#[..] ...), но это не то, что мне нужно.

Спасибо за любой ответ или помощь.


person Nicolas Cailloux    schedule 11.03.2015    source источник


Ответы (1)


Свойства записей — это атомы. Чтобы преобразовать строку в атом, используйте String.toAtom. Например:

declare
L = {String.toAtom "dynamic string"}
R = {MakeRecord record [L]}
{Show R}

Однако, если я правильно помню, есть одна оговорка: атомы не собираются мусором. Если вы создадите очень много разных атомов, у вас могут возникнуть проблемы с памятью.

person wmeyer    schedule 11.03.2015
comment
Ты только что спас мне жизнь. На самом деле, я также пытался преобразовать строку в атом, это не сработало. Настоящая проблема в том, что я идиот, который, по-видимому, не может читать журналы ошибок: я пытался использовать MakeRecord со спецификацией AdjoinList. Конечно, Оз пожаловался, что ожидает список функций, пока я проходил [day1#content1 day2#content2 ...]. В любом случае, спасибо, теперь моя программа хорошо работает и хорошо выглядит :) - person Nicolas Cailloux; 11.03.2015