2016-12-11 2 views
2

Найдено это время ищет функцию memoizing:В чем разница между make-hash make-weak-hash в racket?

#lang scheme 

(define (memo f) 
    (define mh (make-hash)) 
    (lambda p 
    (hash-ref mh p (lambda() 
        (hash-set! mh p (apply f p)) 
        (hash-ref mh p))))) 

(define-syntax-rule (defmemo (id . p) . body) 
    (define id (memo (lambda p . body)))) 

(provide defmemo) 

, как показано здесь: Writing an auto-memoizer in Scheme. Help with macro and a wrapper

Однако в документации есть также: макияж слабого хэш и делать-непреложный-хэш. Какая хэш-функция лучше для memoization?

ответ

1

Большой вопрос.

Я бы сказал, что для запоминания, наклеивающего make-hash, это ваш лучший выбор. Другие варианты используются для разных целей.

  • make-immutable-hash для изготовления, ну, вы догадались, неизменные хэш-таблицы. Хэш-таблицы, которые он создает, такие же, как если бы вы создали их с помощью hash. Конечно, элементы «в» таблице все еще могут быть изменены, например, если вы помещаете там изменяемую структуру. Просто, что сама таблица не изменчива.

  • make-hash Используется для создания изменяемых хэш-таблиц. Вероятно, это именно то, что вы хотите здесь, так как вы мутируете свою таблицу memoization.

  • make-weak-hash на самом деле совершенно другой. В частности, он хранит «слабые» указатели на элементы в таблице. То есть, это не считается указателем в отношении сборщика мусора. Таким образом, если вы их используете, ваши предметы могут быть собраны. (Это не означает, что вы получите segfault, вы просто можете потерять свои данные.) Таким образом, вы, как правило, не хотите эту таблицу, если не знаете, что конкретно хотите этого поведения.

+0

где будет использоваться 'make-weak-hash'? – X10D

+0

Каждый раз, когда вы не хотите, чтобы GC сохранял ваш объект только потому, что он был в вашей таблице. Например, если вы реализуете финализатор, вы можете использовать make-weak-hash. –

Смежные вопросы