[英]Can't take value of a macro: #'clojure.core/case
我正在Clojure的函數中創建一個函數,以模擬Java的對象概念,其中函數人的行為就像構造函數。 (只需要在Clojure中使用此概念來解決問題即可。)
(defn person [name age]
(def p (fn [args & age]
case args
:set-name (person (first args) age)
:set-age (person age)
;; :get-name (person (first args))
;; :get-age ()
)))
但是我收到以下錯誤:
CompilerException java.lang.RuntimeException:無法獲取宏的值:#'clojure.core / case,編譯:(null:2:8)
def
或defn
使用def
。 使用def
是一個全局聲明,它應該(幾乎)在源文件中始終獨立存在。 有關在線介紹,請參見《 Clojure for the Brave&True 》,或閱讀《 Getting Clojure
等許多好書。
case
的原諒: 例:
(case args ...)
case
實際上是主要為Java對象互操作而設計的特殊功能,並且存在一些嚴重的局限性(即“優化”)。 使用cond
幾乎總是更好的恕我直言。 例:
(cond
(= :set-name args) (person (first args) age)
(= :set-age args) (person age)
...)
case
的問題之一是它必須是編譯時文字 。 但是,這並不明顯,如果您嘗試使用不符合定義的內容,也不會發出警告。 然后,您只會遇到無聲的失敗。 這個例子看起來應該返回"my vec"
,但是失敗並返回"default"
:
; "The test-constants are not evaluated. They must be compile-time
; literals, and need not be quoted."
(let [myvec [1 2]]
(case myvec
[] "empty vec"
(vec '(1 2)) "my vec"
"default"))
;=> "default"
因此,使用case
會使誘餌陷阱隨時准備在沒有警告的case
破壞您的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.