Одна из приятных особенностей Джулии состоит в том, что подобные пакеты представляют собой просто больше кода Джулии, вместо того, чтобы делать что-то в C, что невозможно ткнуть с основного языка. А код для Memoize
довольно прост. Взгляните на эту строку :
fcachename = Symbol("##", f, "_memoized_cache")
Это сообщает вам имя словаря кеша, заданного f
как имя функции, которая запоминается. Итак, давайте попробуем получить доступ к переменной с этим именем после запуска вашего примера кода:
julia> var"##f_memoized_cache"
IdDict{Any,Any} with 10 entries:
(7,) => 64
(6,) => 32
(4,) => 8
(5,) => 16
(9,) => 256
(10,) => 512
(2,) => 2
(8,) => 128
(1,) => 1
(3,) => 4
Voila! Вот собственно кеш. Это просто IdDict
со странным именем в том же модуле, что и определение метода. Синтаксис var"..."
- это недавно добавленный синтаксис настраиваемого строкового литерала для идентификатора со «странным» именем - это сокращение для выполнения eval(Symbol("##f_memoized_cache"))
.
Конечно, поскольку это не официально задокументировано часть Memoize
API, вы не можете рассчитывать на то, что он не изменится, но в настоящее время он работает. Я не уверен, что вам нужен более официальный API, но если вы захотите, вы можете открыть вопрос с просьбой об этом как о новой функции.