0
    n = (count somevector)        
   (foo [w] ( for [i (range n) 
                   j (range w)
                   :let [n (* i j)] 
                   :while ( < i j)
                  ] 
              (println n)))

私がそれを実行すると。

=> (foo 10) ClassCastException clojure. lang. LazySeqにキャストできませんclojurelang. IFn HelloWorld.core/foo

私が本当にやりたいことは、入れ子になった for ループをいくつか持ち、その中にいくつかの ifs と else を入れて、いくつかのチェックを行うことです。

編集 ::

判明したように、以下もエラーを引き起こします

(defn foo [arg]
 (      
      for [ i (range (count vector)) ]
      (
        for [j arg ]
        [i j]
        ) 

     ) ) 

IllegalArgumentException java.lang.Long clojure.lang.RT.seqFrom から ISeq を作成する方法がわからない

編集::

以下の作品

(defn foo [arg]
  (def w arg) 
(for [ i (range (count vector)) ]
      (
        for [j (range v)  ]
        [i j]
        )
  )   )

そもそもなぜうまくいかないのか、誰かが理解するのを手伝ってくれますか?

4

3 に答える 3

7

を使用すると、最初の値がfalseであるため、nullが返され :whileます。for-loop:when

user=> (for [i (range 3) j (range 5)] [i j])
([0 0] [0 1] [0 2] [0 3] [0 4] [1 0] [1 1] [1 2] [1 3] [1 4] [2 0] [2 1] [2 2] [2 3] [2 4])
user=> (for [i (range 3) j (range 5) :while (< i j)] [i j])
()
user=> (for [i (range 3) j (range 5) :when (< i j)] [i j])
([0 1] [0 2] [0 3] [0 4] [1 2] [1 3] [1 4] [2 3] [2 4])
于 2012-07-19T13:24:17.863 に答える
3

最初に知っておくべきことは、clojureforは for ループではなく、リスト内包表記であるということです。

これは、指定されたプロパティを持つリスト (実際には遅延シーケンス) を作成するために使用されることを意味します。

オリジナルforは次のようになります。

(for [i (range n) 
      j (range w)
      :let [n (* i j)] 
      :while ( < i j)] 
  (println n))

(元の例ではクラスキャスト例外は発生しません)。

それが言っていることは次のiとおりjですi < j。andの最初のペアはiandjです。0 < 0 ですか? いいえ、やめてください。つまり、空のシーケンスを作成しています。i = 0j = 0

ここで、 with を変更する:whileと、意味:whenが次のように変わります。つまり、i >= j に遭遇してもシーケンスの構築を停止せず、このペアをスキップするだけです。iji < j

次に注意することは、println. この関数は引数を出力しますが、常に を返しますnil。この戻り値は、結果シーケンスで得られるものであり、出力は副作用と呼ばれます。一般に、レイジー シーケンスの副作用は必要ありません。それら (副作用) は必要なときに発生するからです。つまり、返されたシーケンスを変数に割り当てた場合、どのprintlns も呼び出されません。シーケンスが実現されると、それらはポップアップし始めます。

for要するに、ループとは考えず、シーケンス コンストラクターと考えてください。

于 2012-07-20T07:12:28.523 に答える
3

java.lang.Long clojure.lang.RT.seqFrom から ISeq を作成する方法がわからない

このエラー メッセージには、例外の原因が正確に示されています。aが期待されるlong場所に値を渡したと思います。seq私はそれを再現できました:

user> (def v [1 2 3])
#'user/v
user> (defn foo [arg]
        (for [ i (range (count v)) ]
             (for [j arg ]
                  [i j]))) 
#'user/foo
user> (foo (range 3))
(([0 0] [0 1] [0 2]) ([1 0] [1 1] [1 2]) ([2 0] [2 1] [2 2]))
user> (foo 3)
; Evaluation aborted.
; Don't know how to create ISeq from: java.lang.Long
;  [Thrown class java.lang.IllegalArgumentException]

あなたのfoo機能は機能します。ただし、ネストされた to にバインドされているため、arg引数は である必要があります。seqargforj

于 2012-07-19T14:15:40.073 に答える