如何定义允许引用列表或函数的合同?

时间:2019-11-18 20:40:05

标签: racket

我有一个函数,其单个参数可以是以下之一:

  • 引用列表(我将在上下文中eval
  • 功能

如何将其表达为该论点的契约?

我的第一个猜测是:

(or/c expr? list?)

还有更好的主意吗?

1 个答案:

答案 0 :(得分:1)

由于expr?不存在,因此对于合同的功能部分,应使用procedure?或使用带有箭头构造函数的东西(例如(-> number? any/c))。

此外,由于这是一项功能的合同,因此您应使用->包括域和范围。

示例:

#lang racket

(require racket/contract)
(require rackunit)

(define/contract (f x)
  (-> (or/c (-> number? number?) list?) (or/c number? list?))
  (if (list? x)
      x
      (x 3)))

(check-equal? (f '()) '())
(check-equal? (f add1) 4)