从列表中创建对列表

时间:2013-02-07 09:15:16

标签: lisp common-lisp

我是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不能+1给字符串和循环没有计数器,或者......有人可以给我一个样本吗? / p>

2 个答案:

答案 0 :(得分: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有很多东西,包括你想要的任何计数器。

答案 1 :(得分:1)

您可以通过简单地执行mapcar + cons来连接您描述的两个列表:

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

由于给出了第二个列表,现在问题仅在于生成ABCD列表。这可以通过loop和code-char来实现:

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

将这两者结合起来并根据您的具体问题进行调整应该很容易。