Как сделать значение в Racket таким, чтобы никакой другой код не мог создать значение equal?
для этого значения?
Причина, по которой я хочу это, состоит в том, чтобы обозначать заполнитель внутри различных других структур данных.Например, предположим, что у нас есть небольшая коллекция атрибутов ключ-значение, таких как:
'((name . breakfast) (successor . lunch) (predecessor . placeholder))
(define (placeholder? x) (eq? x 'placeholder))
Цель состоит в том, чтобы показать, что предшественник breakfast
в настоящее время неизвестен, поэтому временно мы помещаемзаполнитель в этом слоте.Мы наполним это реальным предшественником позже.Вышеприведенное не совсем верно, потому что нельзя сказать, что предшественник breakfast
действительно является символом 'placeholder
.(Аналогично для представления специальных вещей, таких как «не имеет ни одного».) Примерно так можно решить эту проблему:
(define placeholder (make-unique-value)
(define (placeholder? x) (eq? x placeholder))
`((name . breakfast) (successor . lunch) (predecessor . ,placeholder))
Поскольку placeholder
является специальным значением, вы не можете случайно сделать другоепросто сделав символ 'placeholder
.Было бы хорошо, если бы уникальное значение placeholder
ни к чему не было бы equal?
;таким образом, он также может служить ключом в хеш-таблицах или где угодно.Дело в том, что вам не нужно беспокоиться о «гочах».
Если создание уникального значения, например #t
или #f
, не способ сделать это в Racket, я бы согласилсяответ, который показал Rackety способ сделать это.