2017-04-06 40 views
-1

我對Common Lisp和Lisp是一個全新的概念。我有一個使用Common Lisp編寫的任務,甚至無法知道如何開始。我的程序將從1到9的字符串格式的數字,他們將有一個字拼寫錯誤,但正確的長度;例如:在Common Lisp中將拼寫錯誤的文本轉換爲整數?

too -> 2 
threa -> 3 

等等。當我給出錯誤的文本時,我需要打印整數,我真的不知道如何開始。任何幫助,將不勝感激。

在此先感謝。

+1

好的入門書免費下載PDF版:https://www.cs.cmu.edu/~dst/LispBook/ –

+0

我稍後會看看這本書。感謝您的推薦 – plank223

回答

2

聽起來很有趣:-)

讓我們做平常Lisp的方式 - 通過增長語言來解決問題。

問題是:將字符串與字典進行匹配,以至多允許一個拼寫錯誤。

這裏是字典:

(defparameter *dictionary* 
    (loop for i from 1 to 9 collect (cons (format nil "~R" i) i))) 

這一切意味着什麼,兩個字符串相匹配?

(defun diff (s1 s2) 
    "Count the number of differences in the shortest common start." 
    (loop for c1 across s1 
    for c2 across s2 
    sum (if (char= c1 c2) 0 1))) 
(diff "abc" "abcde") 
==> 0 
(diff "abc" "aba") 
==> 1 

現在匹配:

(defun matchp (s1 s2) 
    "Two strings match iff they have the same length and 1 different character." 
    (and (= (length s1) 
      (length s2)) 
     (= 1 (diff s1 s2)))) 
(matchp "a" "b") 
==> T 
(matchp "too" "two") 
==> T 
(matchp "one" "one") 
==> NIL 

最後,找到字符串中的詞典:

(defun parse-string (s) 
    (loop for (name . number) in *dictionary* 
    if (matchp name s) return number)) 
(parse-string "one") 
==> NIL ; not found 
(parse-string "onn") 
==> 1 
(parse-string "too") 
==> 2 
(parse-string "thre3") 
==> 3 
(parse-string "foor") 
==> 4 
(parse-string "fivv") 
==> 5 
(parse-string "sis") 
==> 6 
(parse-string "sever") 
==> 7 
(parse-string "aight") 
==> 8 
(parse-string "nane") 
==> 9 

PS。我使用了相當先進的loop工具:如果這是家庭作業,您可能不會使用它,所以您將不得不使用更簡單的成語來重寫我的代碼。

PPS。你應該讀一本書,aclpcl都不錯。

+0

@ plank223我不會產生任何錯誤。你遇到了什麼錯誤? – Sylwester

+0

非常感謝你。這救了我。謝謝了很多sds和Sylwester,原來問題不在代碼中,這是另一個問題,謝謝。 – plank223