(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) ) (map (lambda ( (int number) (string family) ) (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 (max 10 number)) ) ) (range 1 13 1) (var family) ) ) ) (global (list card) deck_template) (add_all! (eval card_generator Hearts) deck_template) (add_all! (eval card_generator Spades) deck_template) (add_all! (eval card_generator Diamonds) deck_template) (add_all! (eval card_generator Clubs) deck_template) (define_sequence compute_score (((ptr (list card)) deck) ((ptr int) result)) (local int aces_count) (local int maybe_better_score) (set (at result) 0) (foreach (at deck) card (set (at result) (+ card.score (at result))) (if (= (var card.number) 1) (set aces_count (+ aces_count 1)) ) ) (while (> aces_count 0) (set maybe_better_score (+ (at result) 10)) (if (=< maybe_better_score 21) (set (at result) (var maybe_better_score)) ) (set aces_count (- aces_count 1)) ) )