Как указать необязательный аргумент в пункте контракта в Racket?

Учитывая, что у меня есть функция с подписью, например следующая

(define (my-method a [b 100])
    (/ a b)
 )

, как мне указать такую ​​подпись в contract-out?

С использованием

(contract-out
          [my-method (-> number? number? number?)])

а потом в другом модуле

(my-method 200)

не помогает, так как выдает ошибку: «Нарушение контракта, получено: 1 аргумент, ожидается: 2 аргумента, не являющегося ключевым словом». И я думаю, что я не могу просто объединить два контракта с необязательным использованием or/c и без него.


person Bohdan Ivanov    schedule 26.08.2019    source источник


Ответы (1)


Используйте ->* и перечислите сначала обязательные аргументы (в группе), затем необязательные аргументы (во второй группе), а затем результат. Есть и более продвинутые варианты; см. документы.

(contract-out
  [my-method
   (->* [number?]  ;; 1 mandatory argument
        [number?]  ;; 1 optional argument
        number?)])

Это описано в главе Контракты Руководства по рэкету в разделе Необязательные аргументы.

person Ryan Culpepper    schedule 26.08.2019