从混合列表中返回字符列表

时间:2018-10-29 18:55:35

标签: lisp common-lisp

我正在尝试编写Lisp函数以从列表(包含整数,字符等)中返回字符列表(无重复)。我仍然是Lisp的初学者,开始时遇到麻烦。我们的教授提到使用原子,但我不明白她的意思。这是问题:

“编写一个接受列表作为输入参数的lisp函数(列表由整数,小数, 字符和嵌套列表),并创建一个包含原始列表中所有字符的列表,不包含任何字符 复制。示例程序输出如下所示:

  1. ’((z f)(b a 5 3.5)6(7)(a)c)->(z f b a c)
  2. ’(((n)2(6 h 7.8)(w f)(n)(c)n)->(h w f c n)“

1 个答案:

答案 0 :(得分:2)

您的作业所谓的“字符”实际上是名称长度为1的符号。似乎您可以在脑海中将“字符”一词替换为“符号”并使用它。

原子是任何不是缺点的东西-任何非空列表都由一系列缺点组成。例如,符号,数字,字符串和nil是原子。

一个缺点(实际上是一个缺点单元格)是一个简单的数据结构,可以容纳两件事。在列表中,每个缺点的第一件事是某个列表元素,第二个缺点是指向下一个缺点的指针或nil。您也可以将列表作为列表元素。那么第一件事就是指向列表的指针。这将正式成为一棵树。缺点的第一件事的访问者函数称为carfirst,另一件事的访问者函数称为cdrrestCarcdr有点陈旧,主要在将cons单元视为树节点时使用,而firstrest更现代,并且主要用于您将cons单元格视为列表链链接。

您可以使用函数atom测试事物是否是原子。如果它不是原子,则它是一个至少包含一个元素的列表。

您的作业包括以下几个部分:

  • 在树上行走以查看每个元素。这可以通过递归来实现,也可以通过在一个方向上循环再在另一个方向上递归来实现。
  • 保留已找到的符号列表。
  • 如果要查看的元素是符号(名称的长度为1…),则检查它是否为新符号,如果是,则将其添加到列表中。
  • 最后返回该列表。

一个有用的习惯用法是使用pushpushnew,它们将新元素放在列表的前面,并在列表reverse的末尾。