Ограничения на значения структуры - PullRequest
2 голосов
/ 27 апреля 2019

Я хочу определить point структуру и проверить, что (x, y) удовлетворяет уравнению y^2 = x^3 + ax + b.

(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) 

(1) Должно работать, потому что -7^2 = 3^3 + 5*3 + 7

(2) Должно вызвать ошибку, потому что 4^2 != -2^3 + 5*3 + 7

Я знаю, что мне нужен какой-то контракт, но я застрял, пытаясь понять, как это сделать ....

1 Ответ

6 голосов
/ 27 апреля 2019

Есть аргумент ключевого слова с именем #: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

См. Пример https://docs.racket -lang.org / reference / define-struct.html (celsius). См. https://docs.racket -lang.org / reference / creationmorestructs.html для полного описания функции защиты.

...