【发布时间】:2017-11-06 03:10:38
【问题描述】:
我正在尝试在 Lisp 中创建一个自定义的反向列表。我对 Lisp 编程很陌生,仍然在语法上苦苦挣扎。这是我目前的代码
(defun new-union(l1 l2)
(setq l (union l1 l2))
(let (res)
(loop for x in l
do(setq res (cons (car l) res))
do(setq l (cdr l)))))
在这里,我将列出两个列表,并形成联合列表 l。然后为了反转列表l,我正在明智地访问元素以将其附加到新列表res。然后使用cons、car 和cdr 更新列表。
但是,我得到了一个奇怪的输出。有人可以建议我哪里出错了吗?
我知道一个名为 nreverse 的内置函数,但我想尝试看看 Lisp 如何解释列表中的数据。
在最后打印res,例如
(new-union '(a b c) '(d e f))
上面调用的输出给了我
(L A A A A A A A X X)
我认为我做错了循环。
【问题讨论】:
-
你是在执行反向还是联合?
-
你永远不会返回资源。结果是最后一个表达式的值,这里是循环,它通过累加子句或 finally 子句不产生任何值。循环...做成语是 eq。顺便说一句,这里是一个dolist。
-
另外,你在 L 上调用 setq,这很糟糕:L 应该是一个局部变量,用 let 声明,像 res。
-
您在迭代 L 时对其进行修改:充其量您跳过列表中的所有其他元素,但这很危险:lispworks.com/documentation/lw51/CLHS/Issues/iss240_w.htm
-
循环已经在 L 上进行了迭代,您只需通过将每个连续的 x 推到它前面来修改 res。你快到了。
标签: lisp common-lisp clisp