删除列表中的特定项目?

时间:2015-10-29 01:26:24

标签: list lisp common-lisp

我想先说这是,这是我正在做的一个家庭作业问题,我不想要真正的答案,只是想要朝着正确的方向努力。 Anyhoo,我正在参加编程语言的课程'结构,我们的一个项目是在lisp中编写各种小程序。这个要求用户输入列表和原子,然后从列表中删除原子的所有实例。我已经浏览了互联网,并没有找到所有那些优秀的lisp资源,所以我转向你们所有人。

无论如何,我们的教授通过工作方式给我们很少,而且很少我的意思是什么都没有。

这是我到目前为止所做的,而且它没有用。

gci -rec -Filter *AssemblyInfo* | ForEach { (Get-Content $_.FullName) | ForEach-Object {$_ -replace "1.0.0.0",$env:VERSION } | Set-Content $_.FullName}

当我输入时 (defun removeIt (a lis) (if (null lis) 0 (if (= a (car lis)) (delete (car lis)) (removeIt (cdr lis))))) 作为输入,它给出了一个错误,说明它在需要时得到1个参数2.我做了什么错误?

2 个答案:

答案 0 :(得分:3)

首先,一些化妆品的变化:

(defun remove-it (it list)
  (if (null list) 0
      (if (= it (car list))
          (delete (car list))
          (remove-it (cdr list)))))

CL社区中首选描述性和自然的声音标识符名称。不要害羞使用像list这样的名字 - CL有多个名称空间,所以你不必担心冲突太多。使用连字符而不是驼峰大小写或下划线。另外,read a short style guide.

你说你不想要答案,但有用的提示,所以我们走了:

  • 检查您的基本情况 - 您的结果将是一个列表,那么为什么要返回一个数字?

  • 使用适当的比较功能 - =仅用于数字。

  • 您正在构建新的结果列表,因此无需delete任何内容 - 只是不要添加您不想要的内容。

    • 但请记住添加您想要的内容 - 通过cons将您希望保留的内容构建到结果列表中,以便将您的函数应用到列表的其余部分。

    • 如果你不想保留一个元素,只需继续将你的功能应用到列表的其余部分。

  • 您将函数定义为接受两个参数,但仅使用(cdr list)调用它。提供缺失的论点。

  

我已经在网上搜索过,并没有找到那么多好的口齿不清   资源,

哦,来吧。

无论如何,我建议Touretzky.

顺便说一下,你试图实现的功能是built-in,但你的教授可能不会接受它作为解决方案,而且自己动手做是一个很好的练习。 (要获得额外的功劳,请尝试将其解析为嵌套列表。)

答案 1 :(得分:0)

这是递归函数的一个很好的例子。假设已经存在一个名为my-remove的函数,它将一个原子和一个列表作为参数,并返回没有给定原子的列表。所以(我删除'Y'(X Y Z))=> '(X Z) 现在,你如何使用这个函数代替列表'(X Y Z)你有另一个列表是(A X Y Z),即前面有一个元素A? 您可以将A与您的原子进行比较,然后根据元素A是否与您的原子匹配,您可以将此元素A或不添加到将删除应用于列表的其余部分的结果中。 使用此递归,将使用较短的列表连续调用my-remove函数。现在你只需要考虑基本情况,即当列表为空时,my-remove函数必须返回什么。