评论者:dpsutton
这个问题不涉及不同的命名空间。错误在于 let-fn
将其绑定作为一个全局变量。
简单的复现方法是:
1. lein new mies letfn-bug
,
2. 更新 cljs 版本至 (link: org.clojure/clojurescript "1.9.946")
3. 然后
`
(ns letfn-bug.core
(:require [clojure.browser.repl :as repl]))
(enable-console-print!)
(letfn [(non-unique-name [] 4)]
(defn f1 [] (non-unique-name)))
(letfn [(non-unique-name [] 5)]
(defn f2 [] (non-unique-name)))
(println "应该是4→ " (f1))
(println "应该是5→ " (f2))
`
接着进入 scripts/repl
。
结果为
`
cljs.user=> (load-file "letfn_bug/core.cljs")
应该是4→ 5
应该是5→ 5
nil
cljs.user=>
`
生成的 js 代码
// 由 ClojureScript 1.9.946 编译 {} goog.provide('letfn_bug.core'); goog.require('cljs.core'); goog.require('clojure.browser.repl'); cljs.core.enable_console_print_BANG_.call(null); var non_unique_name = (function letfn_bug$core$non_unique_name(){ return (4); }); letfn_bug.core.f1 = (function letfn_bug$core$f1(){ return non_unique_name.call(null); }); var non_unique_name = (function letfn_bug$core$non_unique_name(){ return (5); }); letfn_bug.core.f2 = (function letfn_bug$core$f2(){ return non_unique_name.call(null); }); cljs.core.println.call(null,"应该是4→ ",letfn_bug.core.f1.call(null)); cljs.core.println.call(null,"应该是5→ ",letfn_bug.core.f2.call(null));