From 48290298ad04d5b794671340bd5bf3bd5383d4fa Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Fri, 24 Sep 2021 16:55:31 +0300 Subject: feat(tazjin/russian): Add macro to populate word table Adds a stupid macro that populates a 'russian-words' hash table in which merged definitions of words are available. Change-Id: Ide7825577ba26d63ff564e54601541f39ab5a1a6 --- users/tazjin/russian/russian.el | 65 +++++++++++++++++++++++++++++++++++++++++ users/tazjin/russian/words.el | 8 ++++- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 users/tazjin/russian/russian.el (limited to 'users') diff --git a/users/tazjin/russian/russian.el b/users/tazjin/russian/russian.el new file mode 100644 index 0000000000..1ef911199f --- /dev/null +++ b/users/tazjin/russian/russian.el @@ -0,0 +1,65 @@ +(require 'cl-macs) +(require 'ht) +(require 'seq) + +;; Type definitions for Russian structures + +(cl-defstruct russian-word + "Definition and metadata of a single Russian word." + (word nil :type string) + (translations :type list + :documentation "List of lists of strings, each a set of translations.") + + (notes nil :type list ;; of string + :documentation "free-form notes about this word") + + (roots nil :type list ;; of string + :documentation "list of strings that correspond with roots (exact string match)")) + +(defun russian--merge-words (previous new) + "Merge two Russian word definitions together. If no previous + definition exists, only the new one will be returned." + (if (not previous) new + (assert (equal (russian-word-word previous) + (russian-word-word new)) + "different words passed into merge function") + (make-russian-word :word (russian-word-word previous) + :translations (-concat (russian-word-translations previous) + (russian-word-translations new)) + :notes (-concat (russian-word-notes previous) + (russian-word-notes new)) + :roots (-concat (russian-word-roots previous) + (russian-word-roots new))))) + +;; Definitions for creating a data structure of all Russian words. + +(defvar russian-words (make-hash-table) + "Table of all Russian words in the corpus.") + +(defun russian--define-word (word) + "Define a single word in the corpus, optionally merging it with + another entry." + (let ((key (russian-word-word word))) + (ht-set russian-words key (russian--merge-words + (ht-get russian-words key) + word)))) + +(defmacro define-russian-words (&rest words) + "Define the list of all available words. There may be more than + one entry for a word in some cases." + (declare (indent defun)) + + ;; Clear the table before proceeding with insertion + (setq russian-words (make-hash-table)) + + (seq-map + (lambda (word) + (russian--define-word (make-russian-word :word (car word) + :translations (cadr word) + :notes (caddr word) + :roots (cadddr word)))) + words) + + '(message "Defined %s unique words." (ht-size russian-words))) + +(provide 'russian) diff --git a/users/tazjin/russian/words.el b/users/tazjin/russian/words.el index 46276cdd0a..f2b51ba712 100644 --- a/users/tazjin/russian/words.el +++ b/users/tazjin/russian/words.el @@ -4,7 +4,10 @@ ;; translations :: '(translation ...) ;; roots :: '(root ...) -'( ;; 1-50 +(require 'russian-defs) + +(define-russian-words + ;; 1-50 ("и" ("and" "though")) ("в" ("in" "at")) ("не" ("not")) @@ -412,3 +415,6 @@ ("оставить" ("to leave" "to abandon")) ("войти" ("to enter" "to come in") nil ("-й-")) ("длинный" ("long"))) + + +(provide 'russian-words) -- cgit 1.4.1