2024年Clojure调查中分享您的想法!

欢迎!请参阅关于页面了解更多有关此功能的信息。

0 投票
ClojureScript
在bootstrap中,宏形式的{{cljs.core/-}}显然可用为{{_}},例如(_ 7 3)是有效的。

重放


cljs.user=> (require 'cljs.js)
nil
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state))
  "(_ 7 3)" nil {:eval cljs.js/js-eval :context :expr} identity)
{:ns cljs.user, :value 4}

5 答案

0 投票
_由:slipset_发表的评论

因此,在自托管(至少)中,修改后的名称是可用的,您还可以看到`+`的情况

cljs.user=> (_PLUS_ 4 4)
8


(in-ns 'cljs.js)
nil
cljs.js=> (compile-str (empty-state) "(+ 4 4)" nil identity)
{:value "((4) + (4));\n"}
cljs.js=> (compile-str (empty-state) "(_PLUS_ 4 4)" nil identity)
{:value "((4) + (4));\n"}
cljs.js=>


使用特殊的`ns-interns**`作为

(defn ns-interns**
  "Bootstrap only."
  [sym]
  (let [ns-obj (find-ns-obj sym)
        ns     (Namespace. ns-obj sym)]
    (letfn [(step [ret k]
              (let [var-sym (symbol k #_(demunge k))] ;; 不去混淆键名
                   (assoc ret
                  var-sym (Var. #(gobject/get ns-obj k)
                           (:ns ns) {:ns ns}))))]
      (reduce step {} (js-keys ns-obj)))))

你看到`-`被存储在`_`下,例如,在ns-object中的修改后的名称

cljs.core=> (get (ns-interns** 'cljs.core$macros) '_)
#'cljs.core$macros/_
cljs.core=>


0 投票
_由:mfikes_发表的评论

有趣的是,这个补丁在 {{cljs.core/-}} 上能正常工作,但如果我理解正确的话,它似乎并不能完全在 {{cljs.user}} 中定义的新符号上工作。


cljs.user=> (require 'cljs.js)
true
cljs.user=> (def st (cljs.js/empty-state))
#'cljs.user/st
cljs.user=> (cljs.js/eval st '(def foo-bar 17) {:eval cljs.js/js-eval :context :expr} identity)
{:value 17}
cljs.user=> (cljs.js/eval st 'foo_bar {:eval cljs.js/js-eval :context :expr} identity)
警告:使用了未声明的变量 cljs.user/foo_bar
{:value 17}
0 投票
by

评论由:slipset 发表

是的

`
cljs.user=> (def foo-bar 17)

'cljs.user/foo-bar

cljs.user=> foo_bar

        ^

警告:在第 1 行使用了未声明的变量 cljs.user/foo_bar
17
cljs.user=>
`

现在我不记得详情了,但我修复减号的方式是通过代码路径,该路径
尝试确定宏,据我所知。

我想我得看看解析常规符号的代码路径。

0 投票
by

评论由:mfikes 发表

0001-CLJS-1593-only-return-a-var-when-we-re-looking-for-a.patch 失败 {{script/test-self-parity}} (x)

特别是,你会得到

警告:没有找到命名空间 cljs.inference-util,无法定位 cljs/inference_util.cljs、cljs/inference_util.cljc 或提供 "cljs.inference-util" 的 JavaScript 源代码(请检查使用破折号命名的命名空间在 ClojureScript 文件名中使用下划线)在第 15 行 src/test/cljs/cljs/inference_test.cljs 警告:在第 15 行 src/test/cljs/cljs/inference_test.cljs 上使用了未声明的变量 cljs.inference-util/truth_-not_called?

随后是 {{ Cannot read property 'truth__not_called_QMARK_' of undefined }} 错误,可能与减号宏的混合有关。

0 投票
by
参考:[https://clojure.atlassian.net/browse/CLJS-1593](https://clojure.atlassian.net/browse/CLJS-1593)(由 mfikes 报告)
...