约束结构值

时间:2019-04-27 17:38:42

标签: racket

我想定义一个std::cin >> s结构,并检查point是否满足方程(x, y)

y^2 = x^3 + ax + b

(1)应该起作用,因为(struct point (x y a b) #:transparent) (define on-curve (point 3 -7 5 7)) ; (1) (define off-curve (point -2 4 5 7)) ; (2)

(2)应该引发错误,因为-7^2 = 3^3 + 5*3 + 7

我知道我需要某种合同,但是我一直在想办法....

1 个答案:

答案 0 :(得分:6)

有一个名为#:guard的关键字参数可以做到这一点:

(struct point (x y a b)
  #:transparent
  #:guard (λ (x y a b name)
            (unless (= (* y y) (+ (* x x x) (* a x) b))
              (error 'point "not a valid point"))
            (values x y a b)))

(point 3 -7 5 7) ;=> (point 3 -7 5 7)
(point -2 4 5 7) ;=> point: not a valid point

有关示例(celsius),请参见https://docs.racket-lang.org/reference/define-struct.html。有关保护功能的完整说明,请参见https://docs.racket-lang.org/reference/creatingmorestructs.html