我正在尝试创建一个函数,它的工作方式类似于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)

因此varlst都是初始化为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/

10-12 07:33
查看更多