2013-04-02 113 views
0

我必須編寫一個程序,將字符串的元音,輔音和其他符號分別轉換爲C,V和0.我已經完成了這項工作,但我想知道是否有更高效和更優雅的方法來執行此操作。將不勝感激輸入。LISP - 修改字符串

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

此外,我想使它成爲一個字符串,我怎麼能做到這一點?我應該定義一個函數來遍歷列表並將其設置爲一個字符串,還是更簡單的方法?

+1

這個問題應該得到更好的http://codereview.stackexchange.com/問 – akluth

+0

使用「地圖」來代替。如果你的格式和按照典型慣例縮進你的代碼,這將會有所幫助。 –

+0

我不知道如何使用'MAP',你能幫我嗎? –

回答

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" 
+0

雖然當我輸入「spectacuular22ace」它給了我「VCVCCCV0CVCC」,壯觀的AV開頭是一個輔音而不是一個元音,並且超過了它,它只打印一個0而不是兩個0. –

+1

您必須更換「分析在上面的示例中輸入了「-word」。 – huaiyuan

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"