2013-04-02 99 views
1

我想寫一個從字符串中刪除所有元音的函數。我想過定義一個檢測元音的函數,類似於symbolp,zerop等等,如果它是元音,就刪除它。我怎樣才能做到這一點?我將不勝感激這方面的任何投入。由於LISP-從字符串中刪除元音

(defun deletevowels (string) 
(go through the list 
    (if vowel-p deletevowels) 
) 
) 

不過,我有一個刪除一個元音,如果它是最後一個問題,我怎麼能修改此滿足了我想做的事,刪除字符串中的所有元音?在下面的代碼中,我提到了這個函數,元音-p。

(defun strip-vowel (word) 
    "Strip off a trailing vowel from a string." 
    (let* ((str (string word)) 
     (end (- (length str) 1))) 
    (if (vowel-p (char str end)) 
     (subseq str 0 end) 
     str))) 

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

而且,是比較容易,如果我會用下面的函數把字符串到一個列表,然後循環列表而不是字符串來尋找元音和刪除它?

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

只使用'REMOVE-IF'。 –

+0

所以你說的是循環的字符串和刪除 - 如果vowelp? –

+0

'(defun定義delete_vowels(字) (讓(STR(串字)) (端( - (長度STR)1)) ) (刪除-如果#'元音 - 對STR端) ) ( defun vowel -p(char)(找到char「aeiou」:test#'char-equal))' 我在做什麼錯? –

回答

2
CL-USER 27 > (defun vowel-p (char) (find char "aeiou" :test #'char-equal)) 
VOWEL-P 

CL-USER 28 > (remove-if #'vowel-p "abcdef") 
"bcdf" 

見:Common Lisp的Hyperspec,REMOVE-IF

CL-USER 29 > (defun deletevowels (string) (remove-if #'vowel-p string)) 
DELETEVOWELS 

CL-USER 30 > (deletevowels "spectacular") 
"spctclr" 
+0

如果我將'remove-if'放在一個函數中,該函數會有一個由我定義的名字,那麼這將是怎樣的呢?所以我只會打電話(deletevowels「壯觀」),它會給我「spctclr」。 –

+0

@Max無賴:參見上文 –