ahnentafel.lisp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. ;;;; ahnentafel.lisp
  2. (in-package #:genie)
  3. ;;; "ahnentafel" goes here. Hacks and glory await!
  4. (defun generate-ahnentafel (starting-person number-of-generations &optional (num 1))
  5. (let* ((person (get-person starting-person))
  6. (birth (get-birth starting-person))
  7. (father (:/father birth))
  8. (mother (:/mother birth)))
  9. ()))
  10. (defun generate-ahnentafel-numbers (starting-person number-of-generations)
  11. (flet ((get-father (person)
  12. (:/father (get-birth person)))
  13. (get-mother (person)
  14. (:/mother (get-birth person)))
  15. (generate-number (current gender)
  16. (if (string= gender "M")
  17. (* 2 current)
  18. (1+ (* 2 current)))))
  19. (let ((ahnentafel-list (cons (cons 1 starting-person) nil)))
  20. (labels ((recurse (person number generation gender)
  21. (if (not (= generation 0))
  22. (let ((new-number (generate-number number gender))
  23. (father (get-father person))
  24. (mother (get-mother person)))
  25. (push (cons new-number person) ahnentafel-list)
  26. (if (not (= 0 father))
  27. (recurse father new-number (1- generation) "M"))
  28. (if (not (= 0 mother))
  29. (recurse mother new-number (1- generation) "F"))))))
  30. (recurse (get-father starting-person) 1 (1- number-of-generations) "M")
  31. (recurse (get-mother starting-person) 1 (1- number-of-generations) "F"))
  32. ahnentafel-list)))
  33. (defun generate-ahnentafel-text (ahnentafel)
  34. (map 'list (lambda (record)
  35. (let* ((num (car record))
  36. (person (cdr record))
  37. (name (:/person-name (get-person person)))
  38. (birthdate (:/birth-date (get-birth person)))
  39. (death (let ((death-record (get-death person)))
  40. (if (null death-record)
  41. ""
  42. (format nil " -- ~a" (:/death-date death-record))))))
  43. (cons num
  44. (format nil
  45. "~a, ~a~a"
  46. name
  47. birthdate
  48. death))))
  49. ahnentafel))
  50. (defun print-ahnentafel (file start generations)
  51. (let* ((ahnentafel-numbers (generate-ahnentafel-numbers start generations))
  52. (ahnentafel-with-text (generate-ahnentafel-text ahnentafel-numbers))
  53. (sorted-ahnentafel (sort ahnentafel-with-text #'< :key #'car))
  54. (sorted-ahnentafel-mapping (sort ahnentafel-numbers #'< :key #'car)))
  55. (with-open-file (output file
  56. :direction :output
  57. :if-exists :overwrite
  58. :if-does-not-exist :create)
  59. (iter (for (number . text) in sorted-ahnentafel)
  60. (format output "~10,5R: ~A~&" number text)))
  61. (values sorted-ahnentafel-mapping sorted-ahnentafel)))