如何表示持有 var 的函数参数
How to denote a function parameter holding a var
我有一些接收 var 作为参数的函数,我想以标准方式标记参数名称以表示它是一个 var(例如,您记得使用 @ 来获取它的值)。
是否有一些命名约定?你还会使用 *...* 东西吗?
(如果您想知道用例是将一个简单的 Scheme 解释器实现为我在 emacs/cider 中重复调用的 eval 函数,所以我需要 "environment" 在整个 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)))))
我想区分参数 env(变量)和参数 env(值)
您可能想要标记您的变量应该实现 clojure.lang.IDeref
接口,即它是一个 ref, an atom 或任何其他 deref
可用的东西。
据我所知,在 Clojure 中没有命名 deref
able 变量的特定约定。当然,您总是可以发明自己的约定,但我可以为您的问题找到另一种可能的解决方案。
考虑使用标准类型提示,例如:
(defmethod eval-exp :variable [exp ^IDeref env]
(lookup-variable-value exp @env))
甚至
(defmethod eval-exp :variable [exp ^Atom env]
(lookup-variable-value exp @env))
类型提示旨在帮助 Clojure 编译器优化代码以避免反射,但没有人说您不能使用它们来减少代码中的人为错误。
N.B. 不要忘记导入 clojure.lang.IDeref
/clojure.lang.Atom
以使用 short IDeref
/Atom
而不是它的全名。
我有一些接收 var 作为参数的函数,我想以标准方式标记参数名称以表示它是一个 var(例如,您记得使用 @ 来获取它的值)。
是否有一些命名约定?你还会使用 *...* 东西吗?
(如果您想知道用例是将一个简单的 Scheme 解释器实现为我在 emacs/cider 中重复调用的 eval 函数,所以我需要 "environment" 在整个 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)))))
我想区分参数 env(变量)和参数 env(值)
您可能想要标记您的变量应该实现 clojure.lang.IDeref
接口,即它是一个 ref, an atom 或任何其他 deref
可用的东西。
据我所知,在 Clojure 中没有命名 deref
able 变量的特定约定。当然,您总是可以发明自己的约定,但我可以为您的问题找到另一种可能的解决方案。
考虑使用标准类型提示,例如:
(defmethod eval-exp :variable [exp ^IDeref env]
(lookup-variable-value exp @env))
甚至
(defmethod eval-exp :variable [exp ^Atom env]
(lookup-variable-value exp @env))
类型提示旨在帮助 Clojure 编译器优化代码以避免反射,但没有人说您不能使用它们来减少代码中的人为错误。
N.B. 不要忘记导入 clojure.lang.IDeref
/clojure.lang.Atom
以使用 short IDeref
/Atom
而不是它的全名。