2017-04-07 11 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」マクロを使用する必要があります。 これは私がこの関数を作るために書かれている私のコードです:私はこの問題を解決するために何をすべき

(my-member 2 '(3 4 5 2 1 1)) 
-> (3 4 5 2 1 1) 

..

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

しかし、それは動作しませんか?ここで

+2

MEMBERはLispのマクロではありません。 –

+0

':when'とは何ですか? –

+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の2番目の部分です。最後には私がボディを提供していないので、これが最後です。

あなたは、終了条件とどのようなdoの結果であるべきで一つだけの変数と第二の部分を使用してmember機能の同等のものを作ることができます。がんばろう!

+0

ありがとう! – starrykss

関連する問題