вторник, 11 октября 2011 г.

lisp'овое

Продолжаю корчить из себя лиспера. Поскольку часто в emacs, в запале страсти программирования путаю раскладку то и решил по быстрому набросать транслитератор(да, я знаю про xneur). Решил сделать его на CL и потом перевести на eLisp. И опять наткнулся на некую неполноценность elisp. Оказалось что коллекции и строки в нем не тоже самое, в отличие от CL. Ниже приведу код на том и на другом. CL мне нравится все больше. И даже loop который по началу показался чудовищным вдруг начинает нравится.

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*)))

Тем не менее это все работает и тем самым радует меня.

Комментариев нет:

Отправить комментарий