我正在尝试创建一个类似于 Common Lisp 中的 MEMBER 函数的函数。 所以,我想让这个功能像这样工作:
(my-member 2 '(1 4 5 5 3 2 5 6 9))
=> (2 5 6 9)
这与 MEMBER 函数的工作原理完全相同。;
(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)
变成不为 nil 并且当这种情况发生时整个 do
形式的结果是 lst
。这是 do
的第二部分,也是最后一部分,因为我没有提供正文。
您可以只使用一个变量和带有结束条件的第二部分以及 的结果应该是什么来制作
。祝你好运!member
function 的等价物做
关于lisp - 如何在 Common Lisp 中使用 DO 宏编写 MEMBER 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43283408/