我想先说这是,这是我正在做的一个家庭作业问题,我不想要真正的答案,只是想要朝着正确的方向努力。 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.我做了什么错误?
答案 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函数必须返回什么。