display-utils.scm 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. (define-module (display-utils))
  2. (use-modules
  3. ;; SRFI-69 for hash tables
  4. (srfi srfi-69)
  5. (model))
  6. (define-public displayln
  7. (lambda* (#:key (output-port (current-output-port)) (verbose #t) . msgs)
  8. (when verbose
  9. (display (string-append
  10. (string-join
  11. (map (lambda (msg) (simple-format #f "~a" msg)) msgs)
  12. " ") "\n")
  13. output-port))))
  14. ;; alias for displayln
  15. (define-public debug displayln)
  16. (define-public format-fraction
  17. (lambda* (fraction #:key (precision 5))
  18. (format #f
  19. (string-append "~"
  20. (number->string (+ precision 2))
  21. ","
  22. (number->string precision)
  23. "f")
  24. fraction)))
  25. (define-public format-fight-situation
  26. (λ (fight-situation)
  27. (call-with-output-string
  28. (λ (output-port)
  29. (display
  30. (simple-format
  31. #f
  32. "A wins: ~a, A remaining: ~a, D wins: ~a, D remaining: ~a"
  33. (get-att-wins fight-situation)
  34. (get-att-rems fight-situation)
  35. (get-def-wins fight-situation)
  36. (get-def-rems fight-situation))
  37. output-port)))))
  38. (define-public display-probability-and-fight-situation
  39. (lambda* (prob
  40. fight-situation
  41. #:key
  42. (fraction-formatter format-fraction))
  43. (displayln
  44. (string-append "probability "
  45. (fraction-formatter prob)
  46. ": "
  47. (format-fight-situation fight-situation)))))
  48. (define-public display-summary
  49. (lambda* (summary-table
  50. #:key
  51. (fraction-formatter format-fraction))
  52. (let ([number-of-results (apply + (hash-table-values summary-table))])
  53. (let ([sorted-summary-table
  54. (sort (hash-table->alist summary-table)
  55. ;; compare wins λ
  56. (λ (res-and-count1 res-and-count2)
  57. (fight-situation-less-than
  58. (list->fight-situation (car res-and-count1))
  59. (list->fight-situation (car res-and-count2)))))])
  60. (for-each
  61. (λ (res-and-count)
  62. (let ([fight-result (list->fight-situation (car res-and-count))]
  63. [count (cdr res-and-count)])
  64. (display-probability-and-fight-situation
  65. (/ count number-of-results)
  66. fight-result
  67. #:fraction-formatter fraction-formatter)))
  68. sorted-summary-table)))))