Как каждый использует кэшированные данные на функциональном языке, таком как Erlang?

Мне нравится ответ @ limc для ситуаций, когда доступен документ HTML DOM.

Мне нравятся ответы @Michele Bosi и @ Paolo для среды документов без HTML DOM, такой как Node.js.

@ Ответ Михаила Боси можно оптимизировать, устраняя необходимость вызывать замену 4 раза одним вызовом замены в сочетании с умной функцией заменителя:

function escape(s) {
    return s.replace(/[&"<>]/g, function (c) {
        return {
            '&': "&amp;",
            '"': "&quot;",
            '<': "&lt;",
            '>': "&gt;"
        }[c];
    });
}
console.log(escape("<b>This is some text.</b>"));

@ Тест диапазона Паоло можно оптимизировать с помощью хорошо выбранного регулярного выражения, а цикл for можно устранить с помощью функции заменителя:

function escape(s) {
    return s.replace(/[^0-9A-Za-z ]/g, function(c) {
        return "&#" + c.charCodeAt(0) + ";";
    } );
}
console.log(escape("<b>This is some text</b>"));

Как указал @Paolo, эта стратегия будет работать для большего количества сценариев.

16
задан oxbow_lakes 15 June 2009 в 17:16
поделиться

3 ответа

Это данные, которые должны быть неизменными в Erlang, а не акторы.

Долгоживущие акторы обычно живут в хвостовой рекурсивной функции, аргументы которой служат их состоянием и, безусловно, могут изменение между вызовами.

-module(cache).
-export([start/0, get_c/1, put_c/2, clear/1]).

start() -> register(spawn(fun () -> loop(dict:new()) end), cache).

loop(Dict) -> receive
                {get, From, Key} -> From ! {cache_result, Key, dict:fetch(Key, Dict)};
                {set, Key, Value} -> NewDict = dict:store(Key, Value, Dict),
                                     loop(NewDict);
                %% etc.
              end

put_c(Key, Value) -> cache ! {set, Key, Value}
%% etc.

Когда вы вызываете put_c , «состояние» актера изменяется, даже если все задействованные данные неизменяемы.

3
ответ дан 30 November 2019 в 23:18
поделиться

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

Например: get_data (Query, CacheCriteria)

Просто потому, что get_data использует кеш, не значит, что это не работает. Если вызов get_data с одними и теми же аргументами Query и CacheCriteria всегда возвращает одно и то же значение, язык можно считать функциональным.

3
ответ дан 30 November 2019 в 23:18
поделиться

Запомните функцию . Кэш - это просто список / словарь и, следовательно, может быть реализован чисто функциональным образом.

3
ответ дан 30 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: