(fate_version 1) (declare_structure #card (text name) (int number) (int score) ) (local (lambda (list #card) (string)) card_generator) (set! card_generator (lambda ( (string family) ) (list:map (lambda ( (int number) (string family) ) (struct:set_fields (default #card) (number (var number)) (name (text (switch (var number) (1 Ace) (11 Jack) (12 Queen) (13 Kind) (cast string (var number)) ) of (var family) ) ) (score (clamp 1 number 10)) ) ) (list:range 1 13 1) (var family) ) ) ) (global (list #card) deck_template) (list:add_all! (eval card_generator Hearts) (eval card_generator Spades) (eval card_generator Diamonds) (eval card_generator Clubs) deck_template ) (define_sequence compute_score (((ptr (list #card)) deck) ((ptr int) result)) (local int aces_count 0) (local int maybe_better_score 0) (set! (at result) 0) (foreach (at deck) card (set! (at result) (+ card.score (at result))) (if (= (var card.number) 1) (++! aces_count) ) ) (while (> aces_count 0) (set! maybe_better_score (+ (at result) 10)) (if (=< maybe_better_score 21) (set! (at result) (var maybe_better_score)) ) (--! aces_count) ) )