Это ошибка, вызванная тем, что контракты синтаксических объектов недостаточно хороши. В частности, syntax/c
контракт работает с плоскими контрактами, в то время как Typed Racket хочет работать с контрактами-компаньонами, когда задействован тип Any
.
Any
, который здесь используется, является неявным введением Any
на #:opaque
требуется предикат custom-set?
. Он появляется во входных данных, защищая значения, которые начинаются в типизированном коде и заканчиваются нетипизированным кодом. Поскольку нетипизированный код может пытаться связываться с типизированным значением высшего порядка, он должен быть заключен в контракт с компаньоном any-wrap/c
(внутренний для Typed Racket).
any-wrap/c
предназначен для защиты потенциально более высокого уровня. значения порядка и значения контейнера, которые могут содержать значения более высокого порядка. Если какая-то часть была изменяемой или если какая-то часть имела функцию в ней, нетипизированному коду нельзя разрешать изменять эти данные или вызывать эту функцию.
Синтаксические объекты являются контейнерами. Они могут содержать произвольные значения в «синтаксис-е» и свойства синтаксиса. В идеале контракт Typed Racket any-wrap/c
должен заключать объекты синтаксиса в контракты-компаньоны, защищающие эти места. К сожалению, контракт syntax/c
в системе контрактов недостаточно хорош для этого. Из-за этого синтаксиса объекты считаются «небезопасными» контейнерами, и если any-wrap/c
не может их безопасно обернуть, это должно вызвать ошибку контракта.
Единственный способ, которым я могу видеть, что это может быть исправлено в будущем, это улучшив syntax/c
для работы с контрактами-компаньонами. После этого any-wrap/c
может считать синтаксические объекты безопасными контейнерами, как списки.