连接新元素时列表中的意外元素

时间:2014-06-19 17:24:06

标签: list elisp

我已经编写了这个简单的buildPairs函数,该函数应该列出一个列表和#34;某些东西"并返回一对对列表,其中每对由列表中的一个元素和""参数。

 4(defun buildPairs(aList rightChild)
 5  "returns a list of pairs"
 6  (setq ret (list (cons (car aList)
 7                        rightChild)))
 8  (setq newList (cdr aList))
 9  (while newList
10    (print (car newList))
11    (setq ret (append ret
12                      (list(cons (car newList)
13                                 rightChild))))
14
15    (setq newList (cdr newList)))
16
17  ret)
18
19(setq listA '("a1", "a2", "a3"))
20
21
22(length (buildPairs listA "foo"))

我希望第22行返回3。 但由于某种原因,它返回5,我没有CLUE为什么它这样做。 它返回的列表是(("a1" . "foo") (\, . "foo") ("a2" . "foo") (\, . "foo") ("a3" . "foo")),这非常奇怪。

有人可以解释一下我做错了吗?

1 个答案:

答案 0 :(得分:3)

运行代码时,我得到了不同的结果:

(("a1" . "foo") ((\, "a2") . "foo") ((\, "a3") . "foo"))

这是因为listA的值实际上是:

("a1" (\, "a2") (\, "a3"))

你可能打算用逗号写这行:

(setq listA '("a1" "a2" "a3"))

逗号在backquote syntax中具有特殊含义。因为它对以下列表元素应用了特殊含义,所以读者似乎将其呈现为函数调用,即包含“函数”名称和参数的列表。