我正在尝试创建一个函数,它的工作方式类似于Common Lisp中的成员函数。
所以,我想让这个函数像这样工作:
(my-member 2 '(1 4 5 5 3 2 5 6 9))
=> (2 5 6 9)
这与成员函数的工作方式完全相同。;
(member 2 '(1 4 5 5 3 2 5 6 9))
=> (2 5 6 9)
条件是我应该使用“DO”宏来生成此函数。
这是我编写的代码,用于实现以下功能:
(defun my-member (item x)
"This function works like MEMBER function."
(do ((z x (rest z))
(e (first x) (first z)))
(:when (equal item (first z))
(return z))))
但它不起作用。。
(my-member 2 '(3 4 5 2 1 1))
-> (3 4 5 2 1 1)
我该怎么办才能解决这个问题?
最佳答案
以下是使用do
的正确方法:
(do ((var 0 (1+ var))
(lst '() (cons var lst)))
((= var 5) lst)))
; ==> (4 3 2 1 0)
因此
var
和lst
都是初始化为0
和()
的变量,每次迭代后,变量都设置为(1+ var)
和(cons var lst)
。决定何时应该停止的是
(= var 5)
变为非零,而当这发生时,整个do
表单的结果是lst
这是do
的第二部分,也是自从我不供应身体以来的最后一部分。您可以使用一个变量和一个结束条件以及
member
结果的第二部分来制作do
函数的等价物祝你好运!关于lisp - 如何使用Common Lisp中的DO宏编写MEMBER函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43283408/