2012-01-25 17 views
3

私は何かを渡して何かをし、それに基づいてリストを返す関数を持っています。引数として何でもかけることができる関数

すべての値を含む1つのリストにどのような引数が渡されても、どのように処理し、マッシュするのでしょうか?

また、'は、何らかの機能の中から何らかの機能2を呼び出すようになっているため、問題を抱えています。これを回避する方法はありますか?私のケースでは、引数として多かれ少なかれ何かを取ることができる過度に一般的な関数を、他の関数でさえ持っていると便利です。関数へ

可能な引数:

  • NIL(0として扱われるべきである)
  • 数字
  • 空リスト(0として扱われるべきである)のリスト
  • いくつかのリストには、NIL、数字、または
  • が含まれている場合と含まれていない場合があります。
  • さらに多くのリスト

基本的に、私が何をしたい:

(somefunction '() 1 2 3 4 '(1 2 3 4) '(1)) 

...にマッシュポテト/マージする必要があります。

注処理される前に...

(0 1 2 3 4 1 2 3 4 1) 

:これはフォローアップthis question

+1

Stackoverflowは、プログラミング言語の基礎を学ぶのに適していません。私は、LispやCommon Lispに関する基本的な紹介テキストを読むことを提案します。そこでは、Lispにおける引数処理の基本について詳しく説明します。 –

+2

Seconding @Rainer。あなたには、[Practical Common Lisp](http://www.gigamonkeys.com/book/)、[SICP](http://mitpress.mit.edu/sicp/full-text/book/book .html)と[On Lisp](http://www.paulgraham.com/onlisp.html)を参照してください。特にAIに入ることを望んでいるなら、[Norvig](http://www.norvig.com/paip.html)または[two](http://aima.cs.berkeley.edu/ )(しかし、それらは無料ではありません)。 – Inaimathi

+0

何があっても、NILと空のリストはCommon Lispと同じです(リストの強調表示には()が使用され、ボットハリストとシンボルのシンボルの強調表示にはNILが使用されます)私は理解している、歴史的な理由)。 – Vatine

答えて

3

これはそれを行う必要があります。

(defun weird-flatten (a) 
    (cond ((null a) (list 0)) 
      ((atom a) (list a)) 
      (t (mapcan #'weird-flatten a)))) 

(defun foo (&rest args) (weird-flatten args)) 

EDIT:あなたはこれを行うにしようとしているに気づきました学習の練習なので、私は説明すべきだと思います。最初の関数はかなり基本的な再帰です。それについての唯一の奇妙な点は、mapcarではなくmapcanを使用しているため、結果は引数と同じ形を保持するのではなく、フラットなリストにマージされます(mapcarはn項関数をとり、nリストは引数として取ります)その関数をリストの各要素に適用し、結果のシーケンスを返します;それがあなたにとってはあまりにも基本的であるかどうかはわかりません)。

foo関数は、&rest argをとるという点で少し特別です。つまり、関数に任意の数のものを渡すことができ、シンボルargsは渡されたすべての引数のリストにバインドされます。

なぜあなたはNILを好奇心のためにゼロとして扱う必要がありますか?

+0

それは遺伝的アルゴリズムを含むより大きなプロジェクトの一部です。遺伝子は自動生成されたlispコードであり、NILを0にマッピングすることは、遺伝子が所望の出力を伴っていくらか軌道に留まることを確実にする1つの方法です。 – Jarmund

0

あなたのように見えますantを使用してnilsを0にマップし、次にflattenの結果を返します。任意の数の引数を1つのリストに入れるには、& restキーワード(?)も必要です。

は(私はいくつかのコードを生成する検討したいが、私は実際にCLを知りません。)

関連する問題