Как сделать так, чтобы проверка условий продолжалась после того, как в Racket обнаружена истина? - PullRequest
0 голосов
/ 22 сентября 2019
(define p 0)
(define (abc a b c d)
(cond
  [(< (string-length  a) 10) (+ 25 profit)] ;1
  [(string=? "Wow" (substring a 0 3)) (- p 50)]
  [(string=? "Earth" b) (+ p 500)]
  [(string=? "ABC" b) (- p 250)]
  [(> c 0) (+ (* 50 c) p)]
  [(>= 3 d) (- p (+ -20 (* 6 d)))]
  [else (+ p (+ -20 (* 6 d)))]))

Как я могу проверить каждое из этих условий?Обычно, скажем, если 1 истинно, то остальные просто пропустят.

1 Ответ

0 голосов
/ 22 сентября 2019

Использовать результат теста записи списка другое действие ответа записи списка.Когда условие ложно, мы останавливаемся.

(define (cond-all-if-true a b c)
  (local ((define action-list
            (list (λ (x y z) (set! profit (+ profit x)))
                  (λ (x y z) (set! profit (+ profit y)))
                  (λ (x y z) (set! profit (+ profit z)))))

          (define (cond-check-list x y z)
            (list (= x 3)
                  (= y 2)
                  (= z 1)))

          (define (cond-action check-ls action-ls)
            (cond
              [(empty? check-ls)
               "done"]              
              [(first check-ls)
               (begin
                 ((first action-ls) a b c)
                 (cond-action (rest check-ls) (rest action-ls)))]
              [else "done"])))
    (cond-action (cond-check-list a b c) action-list)))


;;; TEST

(define profit 0)
(cond-all-if-true 3 2 1)
(= profit 6)

(set! profit 0)
(cond-all-if-true 3 2 0)
(= profit 5)

(set! profit 0)
(cond-all-if-true 3 0 0)
(= profit 3)

(set! profit 0)
(cond-all-if-true 0 0 0)
(= profit 0)
...