2013-02-07 202 views
1

我是新來的Lisp和不知道該怎麼寫......從列表中創建對列表

You give: ("Test" "TEST" "third" "the last") 
You get: (("A" . "Test") ("B" . "TEST") ("C" . "third") ("D" . "the last")) 
Function: (defun choices (&rest choices)) 

在C,我可以只寫這個for,但Lisp的能't +1到字符串和循環沒有計數器,無論是...有人請給我一個樣本?

回答

2

我會寫這樣的事:

(defun choices (&rest choices) 
    (loop for i from 1 to 26 
     and item in choices 
     collect (cons (string (digit-char (+ 9 i) 36)) 
         item))) 

上面的代碼有沒有錯誤檢查超過26點的選擇(和你 沒有規定如何處理他們,如果它不是一個錯誤)。

你可以使用CHAR-CODECODE-CHAR爲「增加一個字符」, 但他們提供的編碼不規範(僅適用於它的一些 性能保證)。隨着基數36 DIGIT-CHAR,我們 保證得到的權重英文字母(大寫)10至35

當然,LOOP有很多的東西,包括你想要的任何反駁。

+0

正是我想要的!感謝您的示例和解釋:-) –

1

您可以在您簡單地做mapcar +利弊描述的方式連接兩個列表:

(mapcar #'cons '("A" "B" "C" "D") '("Test" "TEST" "third" "the last")) 
; => (("A" . "Test") ("B" . "TEST") ("C" . "third") ("D" . "the last")) 

由於第二列表中給出,現在的問題是隻有在產生ABCD清單。這可以通過循環和代碼char來實現:

(loop for i from 65 to 68 collect (string (code-char i))) 
; => ("A" "B" "C" "D") 

將這兩者合併爲一個答案並將其定製爲您的具體問題應該很容易。