2016-05-28 5 views
1

例。私たちは非常に簡単な機能を持っています。名前が1つだけの場合、どのように機能を実行できますか?

そして、この関数の名前でリストを作成します。

(def listOfFunc '(func1 func2)) 

リストから関数の名前を取得すると、この関数をどのように実行できますか?

私の悪い英語と非常にnoobの質問に申し訳ありません。

+0

(DEFN [F] (F)を実行) (ラン(第マイリスト)) –

答えて

3

これらの機能がリストに格納される理由はありますか?

いいえ、あなたはこのようなものになりますベクトルを使用することができた場合:(nil nil):この2つのNILSの怠惰な配列になることに

(def fns [func1 func2]) 
(map #(%) fns) 

注意を。しかし、あなたの関数が副作用のためだけであれば、あなたが記載されているものとして、あなたはdorunにそれらをラップすることができます:単一nilを返します

(dorun (map #(%) fns)) 

を。

今では、リストの使用を希望する場合は、シンボルを対応する機能に解決する必要があります。だから私はこのような何かがうまくいくと思います:'foo.coreはあなたの機能を持っている名前空間に置き換える必要があり

(map #((ns-resolve 'foo.core %)) listOfFunc) 

+5

リストを使用して '(リスト関数func1の関数func2)'またはベクター '[関数func1の関数func2]は'違いはありません。問題は*リストを引用するとシンボルが解決されないため、後でそれらを解決する必要があることです。 ''(func1 func2)'はシンボルのリストであり、関数のリストではありません。ここでそれを使用する理由はありません。また '(run!#(%)fns)'は '(dorun(map#(%)fns))'よりもクリーンで効率的です。実際には、関数が(この場合のように)副作用を持っている場合、 'map'はまったく使用しないでください。なぜなら、その怠惰は、予測不可能な実行命令によって容易にバグにつながる可能性があるからです。 –

+1

(dorun(マップ番号(%)fns))を(run!#(%)fns)に短縮することができます。 –

関連する問題