我是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>
答案 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-CODE
和CODE-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")
将这两者结合起来并根据您的具体问题进行调整应该很容易。