Clojure在编译时声明不是nil?

时间:2014-03-15 04:01:18

标签: macros clojure compile-time

我们可以在Clojure a way to use design by contract to check that arguments中看到Clojure中的函数在运行时不是零。

(defn constrained-fn [ x]
  {:pre  [(not (nil? x))]}
  x)
(constrained-fn nil)
=> AssertionError Assert failed: (not (nil? x))  ...../constrained-fn (form-init5503436370123861447.clj:1)

我们可以在Clojure中找到check the type of an expression at compile time的方法

(defmacro typeof 
  ([expression]
    (:class (expression-info expression)))

(defmacro primitive? 
  ([expression]
    (:primitive? (expression-info expression))))

以下是基于compile-time macros in Clojure的问题:

(defmacro compile-time-nil-check [x] (assert (not (nil? x))))
(def my-nullable nil)
(compile-time-nil-check my-nullable)

我的问题是 - 有没有办法在Clojure的编译时检查'常量'是不是nil?

(我意识到这个问题可能看似微不足道 - 我想将它用作Clojure中关于编译时类型检查的后续问题的构建块)。

1 个答案:

答案 0 :(得分:0)

如果按常数排序'你的意思是存储在全球var

中的东西
(def my-nullable nil)

可以在编译时解决,然后:

(defmacro compile-time-var-nil-check [x] 
  (let [x @(resolve x)] 
    (assert (not (nil? x)))))