5

実際、私はクロージュア、特にシンボルを完全に理解しようとしています

(def a 1)
(type a)
;;=>java.lang.Long
(type 'a)
;;=>clojure.lang.Symbol

私はそれtypeが関数であることを知っているので、その引数が最初に評価されるので、上記のコードがこのように機能する理由を完全に理解しています.流れるコードでは、マクロを使用して評価を遅らせることにしました

 (defmacro m-type [x] (type x))
 (m-type a)
 ;;==>clojure.lang.Symbol

私はそれで大丈夫ですが、私が理解できないのはこれです:

 (m-type 'a)
 ;;=>clojure.lang.Cons

'a の型が短所である理由

4

1 に答える 1

6

quote文字 ' は、clojure リーダーによってリーダー マクロとして解釈されます。このマクロは、' の後に続く記号を含むリストに展開されるため、 へ(m-type 'a)の呼び出しで'aは次のように展開されます。

user> (macroexpand-1 ''a)
(quote a) 

(quote a)次に、コンスであるリストの型を呼び出します。

これは、m-type マクロが評価中に見たとおりに引数を出力するようにすると、もう少し明確になるかもしれません。

user> (defmacro m-type [x] (println "x is " x) (type x))
#'user/m-type
user> (m-type 'a)
x is  (quote a)
clojure.lang.Cons  
于 2014-01-23T17:35:51.873 に答える