评论由:dpsutton发表
这不需要不同的命名空间。问题是 let-fn
正在将其绑定作为全局变量。
简单的复现方法是:
1. lein new mies letfn-bug
,
2. 更新 ClojureScript 版本为 (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=>
`
生成的 JavaScript 代码如下:
// 由 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));