LISP - 修改字符串

时间:2013-04-02 13:16:57

标签: string lisp common-lisp

我必须编写一个程序,将字符串的元音,辅音和其他符号分别更改为C,V。我已经这样做但我想知道是否有更有效和更优雅的方法来做到这一点。希望得到投入。

(defun string-to-list (string)
(loop for char across string collect char))

(defun is-vowel (char) (find char "aeiou" :test #'char-equal))

(defun is-consonant (char) (find char "bcdfghjklmnpqrstvwxyz" :test #'char-equal))

(defun letter-type (char)
(if (is-vowel char) "V"
(if (is-consonant char) "C"
"0")))

(defun analyze-word (word-string)
(loop for char across word-string collect (letter-type char)))

而且,我想把它变成一个字符串,我怎么能这样做?我应该定义一个迭代整个列表并使其成为字符串的函数,还是更简单的方法呢?

2 个答案:

答案 0 :(得分:2)

(defun letter-type (char)
  (cond ((find char "aeiou" :test #'char-equal) #\V)
        ((alpha-char-p char) #\C)
        (t #\0)))

CL-USER> (map 'string #'letter-type "analyze-word")
"VCVCCCV0CVCC"

答案 1 :(得分:0)

只是为了这个想法:

(defun multi-replace-if (sequence function &rest more-functions)
  (map (type-of sequence)
       (lambda (x)
         (loop for f in (cons function more-functions)
            for result = (funcall f x)
            while (eql x result)
            finally (return result)))
       sequence))

(multi-replace-if "bcdfghjklmnpqrstvwxyz"
                  (lambda (x) (if (find x "aeiouy") #\v x))
                  (lambda (y) (declare (ignore y)) #\c))
"cccccccccccccccccccvc"