From 00d0b2f1ae2dd805c2e3eb03f8da2f947a282a6f Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Sat, 14 Sep 2024 11:25:02 +0200 Subject: [PATCH] feat: add verb declension for Eittlandic --- conlanging-eittlandic.el | 182 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 174 insertions(+), 8 deletions(-) diff --git a/conlanging-eittlandic.el b/conlanging-eittlandic.el index 725e4df..6d0cdd1 100644 --- a/conlanging-eittlandic.el +++ b/conlanging-eittlandic.el @@ -30,8 +30,59 @@ (require 'dash) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Constants ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ; Verbs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconst conlanging-eittlandic--generic-verb-inflexion-indicative-present + '(("" . "r") ("" . "r") ("" . "r") (nil . "um") (nil . "ið") (nil . "ið")) + "Generic indicative present declension for Eittlandic verbs. + +This table shows the declension of verbs for the indicative +present. The order of the declensions is first, second, and +third person, first singular, then plural. + +Each declension is a cons cell containing first the default +underlying vowel, and second the generic suffix.") + +(defconst conlanging-eittlandic--generic-verb-inflexion-subjunctive-present + '((nil . "ir") (nil . "ir") (nil . "ir") + (nil . "im") (nil . "ið") (nil . "ið")) + "Generic subjunctive present declension for Eittlandic verbs. + +See +`conlanging-eittlandic--generic-verb-inflexion-indicative-present'.") + +(defconst conlanging-eittlandic--generic-verb-inflexion-past + '((nil . "t") (nil . "t") (nil . "t") + (nil . "um") (nil . "uð") (nil . "uð")) + "Generic past declension for Eittlandic verbs. + +See +`conlanging-eittlandic--generic-verb-inflexion-indicative-present'.") + +(defconst conlanging-eittlandic--strong-verb-inflexion-passive + '((nil . "umk") (nil . "sk") ("" . "sk") + (nil . "umk") ("" . "sk") ("" . "sk")) + "Strong passive inflexion for Eittlandic verbs. + +See +`conlanging-eittlandic--generic-verb-inflexion-indicative-present'.") + +(defconst conlanging-eittlandic--weak-verb-inflexion-passive + '((nil . "umk") ("" . "isk") ("" . "isk") + (nil . "umk") ("" . "isk") ("" . "isk")) + "Weak passive inflexion for Eittlandic verbs. + +See +`conlanging-eittlandic--generic-verb-inflexion-indicative-present'.") + + ; Nouns ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (defconst conlanging-eittlandic--strong-common-noun-declension - '((nil . "r") (nil . nil) (nil . nil) ("a" . "r") + '((nil . "r") (nil . nil) (nil . nil) ("a" . "r") (nil . "r") (nil . nil) (nil . "um") ("a" . "r")) "Declensions of strong common nouns in Eittlandic. @@ -49,33 +100,39 @@ The order of the suffixes go like this: - plural genitive") (defconst conlanging-eittlandic--strong-common-definite-noun-declension - '(("i" . "nn") ("i" . "n") ("i" . "n") ("i" . "ns") + '(("i" . "nn") ("i" . "n") ("i" . "n") ("i" . "ns") ("i" . "nn") ("i" . "n") ("i" . "num") ("i" . "n")) "Declension of definite strong common nouns in Eittlandic. See `conlanging-eittlandic--strong-common-noun-declension' for more info.") (defconst conlanging-eittlandic--strong-neuter-noun-declension - '((nil . nil) (nil . nil) (nil . nil) (nil . "s") + '((nil . nil) (nil . nil) (nil . nil) (nil . "s") (nil . nil) (nil . nil) (nil . "um") (nil . "s")) "Declensions of strong neuter nouns in Eittlandic. See `conlanging-eittlandic--strong-common-noun-declension' for more info.") (defconst conlanging-eittlandic--weak-noun-declension - '((nil . nil) (nil . nil) (nil . nil) (nil . "s") + '((nil . nil) (nil . nil) (nil . nil) (nil . "s") (nil . "r") (nil . nil) (nil . "um") (nil . "s")) "Declensions of weak nouns in Eittlandic. See `conlanging-eittlandic--strong-common-noun-declension' for more info.") (defconst conlanging-eittlandic--other-definite-noun-declension - '(("i" . "t") ("i" . "t") ("i" . "t") ("i" . "ts") + '(("i" . "t") ("i" . "t") ("i" . "t") ("i" . "ts") ("i" . "tr") ("i" . "t") ("i" . "tum") ("i" . "t")) "Declensions of definite strong neutral and weak nouns in Eittlandic. See `conlanging-eittlandic--strong-common-noun-declension' for more info.") +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Functions ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ; Generic ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (defun conlanging-eittlandic--maybe-underlying-vowel (underlying-vowel default-vowel) "Return which underlying vowel should be used. @@ -93,8 +150,8 @@ UNDERLYING-VOWEL is non-nil." (second-half (seq-subseq list half))) (cons first-half second-half))) -(defun conlanging-eittlandic--make-noun-declension-from-table (root underlying-vowel table) - "Decline a noun ROOT (with maybe an UNDERLYING-VOWEL) with TABLE." +(defun conlanging-eittlandic--generate-declension-from-table (root underlying-vowel table) + "Decline a ROOT (with maybe an UNDERLYING-VOWEL) with TABLE." (seq-reverse (let (result) (dolist (declension table result) @@ -103,6 +160,79 @@ UNDERLYING-VOWEL is non-nil." (cdr declension)) result))))) + ; Verbs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmacro conlanging-eittlandic--build-verb-declension-org () + "Just to avoid typing all of this out. + +ROOT, IMPERATIVE-PASSIVE, PRESENT-PARTICIPLE, PAST-PARTICIPLE, +IND-PRES, SUBJ-PRES, PAST, and PASSIVE are all different forms of +the verb that will be inserted in the org text." + `(format "Declensions: +- infinitive :: %s +- imperative :: %s +- imperative passive voice :: %s +- present participle :: %s +- past participle :: %s + +| | | | | | | +| person | | Ind. Pres. | Subj. Pres. | Past | Passive | +|--------+-+------------+-------------+------+---------| +| 1s | | %s | %s | %s | %s | +| 2s | | %s | %s | %s | %s | +| 3s | | %s | %s | %s | %s | +| 1p | | %s | %s | %s | %s | +| 2p | | %s | %s | %s | %s | +| 3p | | %s | %s | %s | %s |" + root root (concat root "ask") (concat root "and") (concat root "it") + ,@(let (accessor i) + (reverse (dolist (declension + '(indicative-present subjunctive-present past passive) + accessor) + (setq i 0) + (while (< i 6) + (push `(nth ,i ,declension) accessor) + (setq i (1+ i)))))))) + +(defun conlanging-eittlandic--make-passive-verb-declension (root strength underlying-vowel passive-consonant passive-vowel) + "Create a verb declension for the passive mood. + +Generates a passive declension for a verb with its ROOT based on +its STRENGTH and UNDERLYING-VOWEL. If there is no underlying +vowel for weak verbs, then the PASSIVE-VOWEL may be used instead. + +If the verb is a verb is a strong verb, the PASSIVE-CONSONANT +will be used in some declensions." + (if (eq 'strong strength) + (conlanging-eittlandic--generate-declension-from-table root (or passive-vowel underlying-vowel) + conlanging-eittlandic--strong-verb-inflexion-passive) + (conlanging-eittlandic--generate-declension-from-table root passive-consonant + conlanging-eittlandic--weak-verb-inflexion-passive))) + +(defun conlanging-eittlandic--make-verb-declension (root strength underlying-vowel passive-consonant passive-vowel mood tense) + "Create a verb declension based on its MOOD and TENSE. + +Based on a verb’s ROOT, STRENGTH, UNDERLYING-VOWEL, and potential +PASSIVE-CONSONANT or PASSIVE-VOWEL, create a verb’s declension as +a list, in the following order: +- first person singular +- second person singular +- third person singular +- first person plural +- second person plural +- third person plural" + (if (eq 'passive mood) + (conlanging-eittlandic--make-passive-verb-declension root strength underlying-vowel passive-consonant passive-vowel) + (if (eq 'past tense) + (conlanging-eittlandic--generate-declension-from-table root underlying-vowel + conlanging-eittlandic--generic-verb-inflexion-past) + (conlanging-eittlandic--generate-declension-from-table + root underlying-vowel + (if (eq 'indicative mood) + conlanging-eittlandic--generic-verb-inflexion-indicative-present + conlanging-eittlandic--generic-verb-inflexion-subjunctive-present))))) + + ; Nouns ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (defun conlanging-eittlandic--make-noun-declension (root gender strength underlying-vowel &optional definite) "Create declensions of a word in Eittlandic. @@ -117,7 +247,7 @@ list, going in the following order: - plural accusative - plural dative - plural genitive" - (conlanging-eittlandic--make-noun-declension-from-table + (conlanging-eittlandic--generate-declension-from-table root underlying-vowel (if definite (if (and (eq 'strong strength) (eq 'common gender)) @@ -144,6 +274,42 @@ list, going in the following order: (push `(nth ,i ,case) accessors) (setq i (1+ i)))))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Public functions ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;###autoload +(defun conlanging-eittlandic-insert-verb-declension (root strength underlying-vowel) + "Insert declensions of ROOT in org format at point. + +Determines how to make declensions of the verb depending on its +STRENGTH and UNDERLYING-VOWEL." + (interactive + (list + (read-string "Verb root: ") + (pcase (completing-read "Strength: " '("strong" "weak") nil t) + ("strong" 'strong) + ("weak" 'weak) + (other (error (format "Unknown strength: %S" other)))) + (let ((vowel (read-string "Underlying vowel (leave blank if none): "))) + (if (string= "" vowel) nil vowel)))) + (let* ((passive-consonant (when (eq 'weak strength) + (completing-read "Consonant for passive declension: " '("d" "t" "ð") nil t))) + (passive-vowel (when (eq 'strong strength) + (completing-read "Vowel for passive declension: " '("a" "i") nil t))) + (indicative-present (conlanging-eittlandic--make-verb-declension root strength underlying-vowel + passive-consonant passive-vowel + 'indicative 'present)) + (subjunctive-present (conlanging-eittlandic--make-verb-declension root strength underlying-vowel + passive-consonant passive-vowel + 'subjunctive 'present)) + (past (conlanging-eittlandic--make-verb-declension root strength underlying-vowel passive-consonant + passive-vowel nil 'past)) + (passive (conlanging-eittlandic--make-verb-declension root strength underlying-vowel + passive-consonant passive-vowel + 'passive nil))) + (insert (conlanging-eittlandic--build-verb-declension-org)))) + ;;;###autoload (defun conlanging-eittlandic-insert-noun-declensions (root gender strength underlying-vowel) "Insert declensions of ROOT in org format at point.