请分享您的想法![填答2024年Clojure调查](https://www.surveymonkey.com/r/clojure2024)

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

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_

因此,在自托管(至少)中,munged 名称是可用的,您也可以在 `+` 中看到这一点

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。"
  [sym]
  (let [ns-obj (find-ns-obj sym)
        ns     (Namespace. ns-obj sym)]
    (letfn [(step [ret k]
              (let [var-sym (symbol k #_(demunge k))] ;; 不取消 munging 键
                (assoc ret
                  var-sym (Var. #(gobject/get ns-obj k)
                            (symbol (str sym) (str var-sym)) {:ns ns}))))]
      (reduce step {} (js-keys ns-obj)))))

您可以看到 `-` 被存储在 `_` 下,例如 ns-object 中的 munged 名称

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)
WARNING: 使用未声明的 Var cljs.user/foo_bar
{:value 17}
0

评论者:slipset

是的

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

'cljs.user/foo-bar

cljs.user=> foo_bar

        ^

WARNING: 在第 1 行使用未声明的 Var cljs.user/foo_bar
17
cljs.user=>
`

现在记不起细节了,但我修复减号的方法是通过代码路径,该路径
尝试理解宏,据我所知。

我认为我需要查看解析常规符号的代码路径。

0

评论者:mfikes

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

特别是,你最终得到

WARNING: 找不到命名空间:cljs.inference-util,无法找到 cljs/inference_util.cljs、cljs/inference_util.cljc 或提供 "cljs.inference-util" 的 JavaScript 源文件,在行 15 src/test/cljs/cljs/inference_test.cljs 中使用未声明的 Var cljs.inference-util/truth_-not-called?,在行 15 src/test/cljs/cljs/inference_test.cljs 中使用

接着是 {{Cannot read property 'truth__not_called_QMARK_' of undefined}} 错误,可能与应用清单中的

0
...