3

Clojure 関数の let バインディング内で宣言された変数の値を変更する方法を知りたいです。以下は私が使用しているコードです。関数が、文字列に含まれるテキストを保持する java.lang.String オブジェクトを返すようにします。

(defn read-text-from-file
  {:doc "fn read-text-from-file is used to output in \"string\"
format the text in a file."}
  [#^String file-name]
  (let [buff-reader (open-file-reader file-name)]
  (loop [full-text "" line (.readLine buff-reader)]
    (when line
      (-> full-text (.concat line))
;      (println full-text)
      (recur (-> file-name (.concat line)) (.readLine buff-reader))))))

: 関数「open-file-reader」は以下のとおりです。

(defn open-file-reader
  {:doc "This is used to open a file, ready for reading"}
  [file-name]
  (let [file-object (java.io.File. file-name)
        buff-reader (-> file-object (java.io.FileReader.)
                        (java.io.BufferedReader.))]
    buff-reader))
4

3 に答える 3

8

のバインディングletは不変であり、再バインドできません。それらを再バインドできたとしても、問題はコードの別の場所にあります。必要なのは、マクロifの代わりに特別なフォームを使用することです。whenを使用すると、 nullの場合とそうでない場合にif返すことができます。full-textlinerecur


slurpただし、これらすべてを実行できる機能を確認することをお勧めします。

user=> (doc slurp)
-------------------------
clojure.core/slurp
([f & opts])
  Opens a reader on f and reads all its contents, returning a string.
  See clojure.java.io/reader for a complete list of supported arguments.
nil

この関数を自分で実装したい場合は、少なくともfull-textStringBuilder を作成することをお勧めします。(str full-text)次に、最終的に返すときに、と言って文字列に変換できます。ただし、Maurice Reeves は、回答でより慣用的な Clojure ソリューションを提供しています。

于 2012-05-18T18:06:20.087 に答える
4

let bindings, like function arguments, are immutable, so you can't change their value.

于 2012-05-18T18:07:41.620 に答える
3

let からバインディングを変更することはできません。不可能です。あなたが達成しようとしていることは、他の人が述べたように丸呑みで行うことができますが、あなたが行っているルートに行きたい場合は、line-seq との組み合わせを使用して buffered-read の内容を返すことができます以下のように適用します。

(defn fetch-file-text [file-name]
     (with-open [rdr (clojure.java.io/reader file-name)]
          (apply str (line-seq rdr)))) 

line-seq の詳細については、http: //clojuredocs.org/clojure_core/clojure.core/line-seqを参照してください。

適用の詳細については、http: //clojuredocs.org/clojure_core/clojure.core/applyをご覧ください。

于 2012-05-18T19:28:27.690 に答える