有条件地从Clojure的核心绑定动态变量,以实现向后兼容

时间:2018-10-24 08:47:04

标签: clojure

我已经尝试了一段时间来解决这个nREPL ticket,但我没有主意,所以我决定在这里寻求帮助。

基本上,只有在存在*print-namespace-maps*的情况下,才需要绑定;; compilation error (when (resolve '*print-namespace-maps*) (set! *print-namespace-maps* (@bindings #'*print-namespace-maps*))) ;; shadows `clojure.core/*print-namespace-maps*` on 1.9, as the def gets executed always (when-not (resolve 'clojure.core/*print-namespace-maps*) (def ^:dynamic *print-namespace-maps* "Define the var for clojure versions below 1.9" nil)) ,或者找到某种方式定义不存在的内容,而不会破坏Clojure 1.9+。

有些不起作用的东西:

ul {
   width: 200px;
   margin: 0;
   padding: 0;
   list-style: none;
   display: flex;
   justify-content: center;
   flex-wrap: wrap;
}
ul li {
  display: inline;
  margin-left:-1em;
  margin-right:1em;
  z-index:1;
}
/* hide stray bullet with ul::before */
ul::before {
  content: " ";
  display: block;
  width: 1em;
  height: 3em;
  background: white;
    z-index: 2;
    position: absolute;
    left: 0;
}

ul li + li::before {
  content: "•";
  display: inline;
  margin: 0 10px;
}
  

似乎动态var根本无法有条件地绑定,这确实很糟糕,但是我想必须有某种方法可以完成我们想要的目标。

查看链接的问题以获取更多详细信息。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

我不完全了解链接问题或nREPL隐含的详细信息,但是@model ProductsListViewModel @foreach (var p in Model.Products) { @Html.Partial("ProductSummary", p) } <div page-model="@Model.PagingInfo" page-action="List" page-classes-enabled="true" page-class="btn" page-class-normal="btn-secondary" page-class-selected="btn-primary" class="btn-group pull-right m-1"> </div> 的行为在这里有点令人惊讶:

def

我希望在评估之后没有Clojure 1.8.0 user=> (when false (def ^:dynamic *foo* 1)) nil 变体,但是它将创建一个未绑定的变体:

*foo*

我想在您的示例中,user=> (var-get #'*foo*) #object[clojure.lang.Var$Unbound 0x20da8800 "Unbound: #'user/*foo*"] 的编译器行为是导致1.9中出现异常的原因:

def

也许可以使用一个宏,以便在宏扩展过程中进行WARNING: *print-namespace-maps* already refers to: #'clojure.core/*print-namespace-maps* in namespace: user, being replaced by: #'user/*print-namespace-maps* 检查,并且在解析时不会发出resolve

def

它似乎在Clojure 1.8上有效:

(defmacro def-dynamic-when-not-resolve [sym value]
  (when-not (resolve sym)
    `(def ~(vary-meta sym assoc :dynamic true) ~value)))

在Clojure 1.9上:

Clojure 1.8.0
user=> (def-dynamic-when-not-resolve *print-namespace-maps* 'sure)
#'user/*print-namespace-maps*
user=> *print-namespace-maps*
sure