2017-04-07 67 views
1

我正在尝试使Common Lisp中的MEMBER函数起作用。 所以,我想使这个函数的工作是这样的:如何在Common Lisp中使用DO宏编写MEMBER函数?

(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) 

+2

会员不是Lisp中的宏。 –

+0

什么是':什么时候? –

+0

哎呀,对不起。 MEMBER是Lisp中的一个内置函数! – starrykss

回答

2

下面是使用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的结果。祝你好运!

+0

非常感谢! – starrykss