我想定义一个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
我知道我需要某种合同,但是我一直在想办法....
答案 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。