簡體   English   中英

clojure中的read-string和load-string有什么區別?

[英]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 "+"))

您不會得到零或例外,因為該語言會為您評估。

  1. 編譯器解析符號+以便評估表達式。
  2. +符號會根據當前的名稱空間別名解析為#'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM