簡體   English   中英

無法獲取宏的值:#'clojure.core / case

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

  1. 您(幾乎總是)不應在另一個defdefn使用def 使用def是一個全局聲明,它應該(幾乎)在源文件中始終獨立存在。

有關在線介紹,請參見《 Clojure for the Brave&True 》,或閱讀《 Getting Clojure等許多好書。

  1. 您忘記了以下case的原諒:

例:

(case args ...)
  1. 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.

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