2015-12-25 18 views
2

當使用require時,我需要在左括號之前使用引號,但是當我使用ns時:require我不必使用引號。這是爲什麼?使用ns中的require來引用括號definitiion

(ns foo) 
(ns user) 
(require '[foo :as f])    ;; quote 
(ns bar (:require [foo :refer :all])) ;; no quote 

我知道報價不計算在括號前面的表達,但不能完全肯定爲什麼需要括號前面的報價,因爲他們沒有表情所以沒有進行評估。

+0

'[foo:refer:all]'和'[foo:as f]'都是表達式,即使是'42'也是一個表達式(在這種情況下自我評估) – noisesmith

+0

對不起,我還沒有哼哼。 [1 2 3]返回[1 2 3],但(1 2 3)返回ClassCastException。我需要'(1 2 3),爲什麼不在數組中的報價?似乎引用或不引用數組表達式總是返回一個數組。爲什麼我必須在需求中使用報價? – Laurent

+0

,因爲當你引用一個表達式時,表達式中的符號不​​會被評估,「no-such-thing'返回一個有效的符號,'no-such-thing'會拋出一個錯誤(除非先前已經將該符號綁定到def或let等)。我在下面更新我的答案,以包含這部分基本原理,這是我跳過的。 – noisesmith

回答

5

你可以未在您的命名空間的約束require符號 - 在'矢量之前(或者只是像(require 'clojure.string)在您不使用任何選項爲例')防止因使用錯誤符號是不受限制的。

ns是一個宏,它使用其主體的:require部分構建對require的調用。宏允許決定哪個輸入被評估,而左是文字輸入,所以你不要使用'ns宏。

相關問題