Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date Racket:在合同中使用的自定义谓词_Date_Scheme_Racket_Predicate_Contract - Fatal编程技术网

Date Racket:在合同中使用的自定义谓词

Date Racket:在合同中使用的自定义谓词,date,scheme,racket,predicate,contract,Date,Scheme,Racket,Predicate,Contract,我正在用Racket编写一个小宠物项目,并使用lib来处理日期 我有一个函数,它接受两个日期(来自Gregor,而不是标准库),我想为它添加合同。合同应规定第一次辩论的日期必须小于/早于第二次辩论的日期 在Gregor中,我们可以通过使用复制来实现它 有没有更简单的方法来实现我想要的 最简单的方法是使用lambda: (->i ([x date?] [y (x) (and/c date? (lambda (y) (date>=? y x)))]) [_ any/

我正在用Racket编写一个小宠物项目,并使用lib来处理日期

我有一个函数,它接受两个日期(来自Gregor,而不是标准库),我想为它添加合同。合同应规定第一次辩论的日期必须小于/早于第二次辩论的日期

在Gregor中,我们可以通过使用复制来实现它


有没有更简单的方法来实现我想要的

最简单的方法是使用
lambda

(->i ([x date?]
      [y (x) (and/c date? (lambda (y) (date>=? y x)))])
     [_ any/c])
一个缺点是,如果违反了约定,错误消息将包含一个
来代替lambda表达式。如果您想在此处打印更有意义的内容,可以执行以下操作:

(define (date>=/c x)
  (flat-named-contract
   `(date>=/c ,x)
   (lambda (y) (date>=? y x))))
....
(->i ([x date?]
      [y (x) (and/c date? (date>=/c x))])
     [_ any/c])

如果您想更好地控制错误消息,可以尝试使用。

虽然Ryan的答案很好,但我发现可以通过以下方式解决此问题,使用前提条件:

(->i ([x date?]
      [y date?])
    #:pre (x y) (date<=? x y)
    ;; ...
 )
(->i([x日期?]
[y日期?])

#:pre(x y)(datePerfect!错误消息确实不是很有用,但对于Racket7.3,至少我可以在跟踪中看到lambda表达式。
(->i ([x date?]
      [y date?])
    #:pre (x y) (date<=? x y)
    ;; ...
 )