[英]What's the difference between read-string and load-string in clojure?
我有以下表格:
((read-string "+") 2 3)
返回3
我對此有兩個問題:
1)為什么上面的表格返回3
而不是nil
或引發異常或其他? 這個表格的解析度如何? 2)在這種情況下, read-string
返回了什么? 與我使用load-string
有什么不同?
(read-string "+")
返回一個符號+
,可以對其進行解析或求值以獲得實際值,即+
函數。
load-string
返回表達式的結果。
換句話說, load-string
等於(eval (read-string "+"))
您不會得到零或例外,因為該語言會為您評估。
+
以便評估表達式。 +
符號會根據當前的名稱空間別名解析為#'clojure.core / +,因為核心別名始終可用。
(class (read-string "+")) ; => clojure.lang.Symbol (class (resolve (read-string "+"))) ; => clojure.lang.Var (class (deref (resolve (read-string "+")))) ; => clojure.core$_PLUS_`
您實際上所做的是將符號用作函數並將參數傳遞給它。 您可以閱讀有關此內容的詳細問答 。 從答案:
現在可以將符號用作函數(它們實現clojure.lang.IFn接口),但是以這種方式使用時,它們的行為方式是在參數中查找自己,即將其參數視為映射並執行查找。在里面
如@akond的回答所述, read-string
返回一個符號, load-string
對其進行評估。 您可以通過傳遞任何其他符號來觸發相同的行為:
((symbol 'hi) 2 3)
;; 3
('foo 2 3)
;; 3
('foo '{foo 2} 3)
;; 2
('foo 2)
;; nil since there is no default value provided
如果您感到好奇,可以看看Clojure源代碼中的Symbol實現 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.