39

Scannerclojure プログラムでJava クラスのローカル インスタンスを作成したいと考えています。これが機能しない理由:

; gives me:  count not supported on this type: Symbol 
(let s (new Scanner "a b c"))

しかし、次のようなグローバル インスタンスを作成できます。

(def s (new Scanner "a b c"))

唯一の違いは範囲であるという印象を受けましたが、どうやらそうではありませんでした。letとはどう違いdefますか?

4

6 に答える 6

14

簡略化:defはグローバル定数用、letはローカル変数用です。

于 2009-03-11T17:33:57.853 に答える
4

let新しい字句スコープを作成fnしてすぐに適用するための構文糖衣と考えることができます。

(let [a 3 b 7] (* a b))  ; 21
; vs.
((fn [a b] (* a b)) 3 7) ; 21

letしたがって、単純なマクロとfn次のように実装できます。

(defmacro fnlet [bindings & body]
  ((fn [pairs]
    `((fn [~@(map first pairs)] ~@body) ~@(map last pairs)))
   (partition 2 bindings)))

(fnlet [a 3 b 7] (* a b)) ; 21
于 2013-12-08T07:56:47.450 に答える