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 不能 +1 字符串和循环也没有计数器......有人可以给我一个示例吗?

4

2 回答 2

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-CODEandCODE-CHAR来“增加一个字符”,但它们提供的编码不是标准化的(仅保证它的某些属性)。在DIGIT-CHAR基数 36 中,我们保证获得权重 10 到 35 的英文字母(大写)。

当然,LOOP还有很多东西,包括你想要的任何计数器。

于 2013-02-07T09:26:59.893 回答
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 for i from 65 to 68 collect (string (code-char i)))
; => ("A" "B" "C" "D")

将这两者结合成一个答案并针对您的特定问题进行定制现在应该很容易。

于 2013-02-07T09:34:21.797 回答