Продолжаю корчить из себя лиспера. Поскольку часто в emacs, в запале страсти программирования путаю раскладку то и решил по быстрому набросать транслитератор(да, я знаю про xneur). Решил сделать его на CL и потом перевести на eLisp. И опять наткнулся на некую неполноценность elisp. Оказалось что коллекции и строки в нем не тоже самое, в отличие от CL. Ниже приведу код на том и на другом. CL мне нравится все больше. И даже loop который по началу показался чудовищным вдруг начинает нравится.
CommonLisp во все красе.
Elisp с проблесками нищеты.
Тем не менее это все работает и тем самым радует меня.
CommonLisp во все красе.
(defvar *latsym* "qwertyuiop[]asdfghjkl;'zxcvbnm,.`/QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~") (defvar *russym* "йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё") (defvar *etalon-rus* "йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ№") (defvar *ignore-syms* ",./?:\";'{}[]") (defun translit (bad-string bad-list good-list) (let ((goot-string "") (pos 0)) (loop for letter across bad-string do (progn (setf pos (position letter bad-list)) (if (equalp pos nil) (setf goot-string (concatenate 'string goot-string (string letter))) (setf goot-string (concatenate 'string goot-string (string (elt good-list pos))))))) goot-string)) (defun find-in-rus(line) (loop for letter across line do (if (equal (position letter *ignore-syms*) nil) (return (position letter *etalon-rus*))))) (defun reverse-lang(input-str) (if (find-in-rus input-str) (translit input-str *russym* *latsym*) (translit input-str *latsym* *russym*))) (format t "~s~%" (reverse-lang '"ghbdtn"))
Elisp с проблесками нищеты.
(defvar *latsym* "qwertyuiop[]asdfghjkl;'zxcvbnm,.`/QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~") (defvar *russym* "йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё") (defvar *etalon-rus* "йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ№") (defvar *ignore-syms* ",./?:\";'{}[]") (defun str-position(param where-col) (let ((i 0) (retindex -1)) (while (< i (length where-col)) (if (string= (string (elt where-col i)) param) (setq retindex i)) (setq i (+ i 1))) retindex)) (defun translit (bad-string bad-list good-list) (let ((goot-string "") (pos 0) (len 0) (letter "")) (while (< len (length bad-string)) (progn (setq letter (string (elt bad-string len))) (setq pos (str-position letter bad-list)) (if (equal pos -1) (setq goot-string (concat goot-string letter)) (setq goot-string (concat goot-string (string (elt good-list pos))))) (setq len (+ len 1)))) goot-string)) (defun find-in-rus(line) (let ((pos 0) (letter "") (result -1)) (while (< pos (length line)) (progn (setq letter (string (elt line pos))) (if (equal (str-position letter *ignore-syms*) -1) (setq result (str-position letter *etalon-rus*))) (setq pos (+ pos 1)))) result)) (defun reverse-lang(input-str) (if (>= (find-in-rus input-str) 0) (translit input-str *russym* *latsym*) (translit input-str *latsym* *russym*)))
Тем не менее это все работает и тем самым радует меня.
Комментариев нет:
Отправить комментарий