1

私は関数仕様で遊んでいますが、それを使用してコンパイル型チェックをエミュレートできるかどうか疑問に思っていますか? マクロはコンパイル時に評価されるため、次のようなことができるとします。

(:require [clojure.spec.alpha :as s]
          [clojure.spec.test.alpha :as st])

(s/fdef divide
        :args (s/cat :x integer? :y integer?)
        :ret number?)

(defn divide [x y] (/ x y))

(st/instrument `divide)

(defmacro typed-divide [arg1 arg2]
  (eval `(divide ~arg1 ~arg2)))

;; this should fail to compile?
(defn typed-divide-by-foo [arg]
  (typed-divide arg :foo))
4

1 に答える 1