评论由dpsutton发表
这不需要不同的命名空间。bug在于 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));