Есть программа. В ней кусок
(require "loadlib.rkt")
...
(define-gobject* g-type-name (_fun _ulong -> string))
...
Допустил опечатку. Вместо _string написал string. Проверка синтаксиса проходит без предупреждений. При загрузке получаю сообщение об ошибке
. . loadlib.rkt:46:8: ffi-call: contract violation
expected: ctype?
given: #<procedure:string>
argument position: 3rd
other arguments...:
#<ffi-obj>
'(#<ctype:uint32>)
#f
#f
#f
В loadlib.rkt:46:8 находится определение макроса define-gobject*. Причём он распаковывается в команду (define-gobject g-type-name (_fun _ulong -> string) #:c-name g_type_name) и никаких ffi-call там нет.
Как добиться от Racket нормальных сообщений об ошибке? Как минимум, нужно место применения макроса, а не его определения. Угадывать по тексту ошибки, в каком именно определении функции неверный аргумент, удовольствие ниже среднего.