12

Pythonでは、リストまたはタプルを関数に渡して、関数に引数をアンパックさせることができます。Clojureでそれを行うにはどうすればよいですか?Pythonコードの例を次に示します。

def f (a, b, c, *d):
    print "a: ", a
    print "b: ", b
    print "c: ", c
    print "d: ", d

f (1, 2, 3, 4, 5, 6)

print
v = (4, 5, 6)
f(1, 2, 3, *v)

結果:

a:  1
b:  2
c:  3
d:  (4, 5, 6)

a:  1
b:  2
c:  3
d:  (4, 5, 6)

私のclojureコードでは:

(defn f [a b c & d]
  (println "a: " a)
  (println "b: " b)
  (println "c: " c)
  (println "d: " d))

(f 1 2 3 4 5 6)

(println)
(def v [4 5 6])
(f 1 2 3 v)

結果:

a:  1
b:  2
c:  3
d:  (4 5 6)

a:  1
b:  2
c:  3
d:  ([4 5 6])

dには要素が1つしかないのですが、どうすれば結果をPythonコードにすることができますか?

4

3 に答える 3

13

Clojureは、Pythonのように、言語機能を備えたベクトルから引数を解凍しません。

解凍に最も近いのは関数applyです。

この特定の場合:

(def v [4 5 6])
(apply f (concat [1 2 3] v))

プリント:

a:  1
b:  2
c:  3
d:  (4 5 6)
于 2012-05-29T15:43:07.323 に答える
5

完全を期すためだけに。

ベクトル[d1 d2 d3]を引数として取る関数があるとします

(defn f
  [a b c [d1 d2 d3]]
  (println "a: " a)
  (println "b: " b)
  (println "c: " c)
  (println "d1: " d1)
  (println "d2: " d2)
  (println "d3: " d3))

このようにして、関数に渡されるベクトルから最初の3つのアイテムを取得できfますd1 d2 d3。上記の関数を呼び出すと、次の出力が得られます。

=> (f 1 2 3 [6 7 8 9])
a:  1
b:  2
c:  3
d1:  6
d2:  7
d3:  8

ベクトルには4つのアイテムが含まれていますが、最初の3つだけを取得することに注意してください。

于 2012-11-20T22:18:18.023 に答える
0

Clojureの引数については、順次?を使用して、引数がスカラー値であるかシーケンスであるかを判別できます。以下の擬似コードでは、

(if (sequential? v)
   (do-something-because-it's-a-sequence v)
   (do-something-different-because-it's-not-a-sequence v))

したがって、Clojureでは、シーケンスがあるかどうかを判断することで、Pythonの例と同じタスクを実行できます。

于 2012-05-29T22:43:46.820 に答える