如何表示保存var的函数参数

gws*_*gws 1 clojure naming-conventions

我有一些函数接收var作为参数,我想以标准方式标记参数名称,以表示它是一个var(所以你记得使用@来获取它的值).

是否有一些命名约定?你还会使用*......*的东西吗?

(如果你想知道用例正在实现一个简单的Scheme解释器作为eval函数,我在emacs/cider中反复调用,所以我需要在整个repl交互中保持"环境")

编辑 - 代码示例

;; given a scheme expression exp and an environment env
;; evaluate it based on the expression type
;; (note that env is a var)
(defmulti eval-exp (fn [exp env] (-dispatch exp)))

;; method to evaluate variables
;; (note that env is a var)
(defmethod eval-exp :variable [exp env]
    (lookup-variable-value exp @env))

;; helper function to lookup var in environment env
;; (note that env is a value)
(defn lookup-variable-value [var env]
     (if (= env the-empty-environment)
         (throw (Exception. (str "Unbound variable " var)))
         (if-let [value (get-var var env)]
             value
             (recur var (enclosing-environment env)))))
Run Code Online (Sandbox Code Playgroud)

我想将参数env(var)与参数env(值)区分开来

Leo*_*tny 5

也许,你想要标记你的变量应该实现clojure.lang.IDeref接口,即它是ref,atom或任何其他deref能力的东西.

据我所知,deref在Clojure中没有特定的约定来命名可变变量.当然,您总是可以创建自己的约定,但我可以看到另一种可能的问题解决方案.

考虑使用标准类型提示,例如:

(defmethod eval-exp :variable [exp ^IDeref env]
  (lookup-variable-value exp @env))
Run Code Online (Sandbox Code Playgroud)

甚至

(defmethod eval-exp :variable [exp ^Atom env]
  (lookup-variable-value exp @env))
Run Code Online (Sandbox Code Playgroud)

类型提示旨在帮助Clojure编译器优化代码以避免反射,但没有人说你不能使用它们来减少代码中的人为错误.

注意:不要忘记导入clojure.lang.IDeref/ clojure.lang.Atom使用短IDeref/ Atom而不是其全名.