评论者: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));