lein run和REPL

时间:2016-07-07 02:17:33

标签: clojure leiningen

我是clojure的新手,并尝试通过解决https://www.4clojure.com的问题来学习它。 任务是实现展平功能。 这是我的实施:

(ns clojure-noob.core                                                           
  (:gen-class))                                                                 

(defn -main                                                                     
  "I don't do a whole lot ... yet."                                             
  []                                                                            
  (= ((fn [coll]                                                                
        (let [flat (fn [coll]                                                   
                     (when-let [s (seq coll)]                                   
                       (if (sequential? (first s))                              
                         (concat (flat (first s)) (flat (rest s)))              
                         (cons (first s) (flat (rest s))))))]                   
          (flat coll)))                                                         
      '((1 2) 3 [4 [5 6]]))                                                     
     '(1 2 3 4 5 6))) 

当我在REPL中运行它时,如( - main),我知道了。

当我以 lein run 运行时,我得到了这个例外:

线程中的异常" main" java.lang.RuntimeException:无法在此上下文中解析符号:flat,编译:(clojure_noob / core.clj:11:42)         在clojure.lang.Compiler.analyze(Compiler.java:6688)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ InvokeExpr.parse(Compiler.java:3766)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6870)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ InvokeExpr.parse(Compiler.java:3834)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6870)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ IfExpr $ Parser.parse(Compiler.java:2797)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)         在clojure.lang.Compiler $ LetExpr $ Parser.parse(Compiler.java:6319)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ IfExpr $ Parser.parse(Compiler.java:2797)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)         在clojure.lang.Compiler $ LetExpr $ Parser.parse(Compiler.java:6319)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)         在clojure.lang.Compiler $ FnMethod.parse(Compiler.java:5380)         在clojure.lang.Compiler $ FnExpr.parse(Compiler.java:3972)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6866)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.access $ 300(Compiler.java:38)         在clojure.lang.Compiler $ LetExpr $ Parser.parse(Compiler.java:6269)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)         在clojure.lang.Compiler $ FnMethod.parse(Compiler.java:5380)         在clojure.lang.Compiler $ FnExpr.parse(Compiler.java:3972)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6866)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ InvokeExpr.parse(Compiler.java:3766)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6870)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ HostExpr $ Parser.parse(Compiler.java:1009)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6863)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)         在clojure.lang.Compiler $ FnMethod.parse(Compiler.java:5380)         在clojure.lang.Compiler $ FnExpr.parse(Compiler.java:3972)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6866)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.access $ 300(Compiler.java:38)         在clojure.lang.Compiler $ DefExpr $ Parser.parse(Compiler.java:589)         在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)         在clojure.lang.Compiler.analyze(Compiler.java:6669)         在clojure.lang.Compiler.analyze(Compiler.java:6625)         在clojure.lang.Compiler.eval(Compiler.java:6931)         在clojure.lang.Compiler.load(Compiler.java:7379)         在clojure.lang.RT.loadResourceScript(RT.java:372)         在clojure.lang.RT.loadResourceScript(RT.java:363)         在clojure.lang.RT.load(RT.java:453)         在clojure.lang.RT.load(RT.java:419)         在clojure.core $ load $ fn__5677.invoke(core.clj:5893)         在clojure.core $ load.invokeStatic(core.clj:5892)         在clojure.core $ load.doInvoke(core.clj:5876)         在clojure.lang.RestFn.invoke(RestFn.java:408)         在clojure.core $ load_one.invokeStatic(core.clj:5697)         在clojure.core $ load_one.invoke(core.clj:5692)         在clojure.core $ load_lib $ fn__5626.invoke(core.clj:5737)         在clojure.core $ load_lib.invokeStatic(core.clj:5736)         在clojure.core $ load_lib.doInvoke(core.clj:5717)         在clojure.lang.RestFn.applyTo(RestFn.java:142)         在clojure.core $ apply.invokeStatic(core.clj:648)         在clojure.core $ load_libs.invokeStatic(core.clj:5774)         在clojure.core $ load_libs.doInvoke(core.clj:5758)         在clojure.lang.RestFn.applyTo(RestFn.java:137)         在clojure.core $ apply.invokeStatic(core.clj:648)         在clojure.core $ require.invokeStatic(core.clj:5796)         在clojure.core $ require.doInvoke(core.clj:5796)         在clojure.lang.RestFn.invoke(RestFn.java:408)         在用户$ eval1036 $ fn__1038.invoke(form-init8418556840412273777.clj:1)         在用户$ eval1036.invokeStatic(form-init8418556840412273777.clj:1)         在用户$ eval1036.invoke(form-init8418556840412273777.clj:1)         在clojure.lang.Compiler.eval(Compiler.java:6927)         在clojure.lang.Compiler.eval(Compiler.java:6917)         在clojure.lang.Compiler.load(Compiler.java:7379)         在clojure.lang.Compiler.loadFile(Compiler.java:7317)         在clojure.main $ load_script.invokeStatic(main.clj:275)         在clojure.main $ init_opt.invokeStatic(main.clj:277)         在clojure.main $ init_opt.invoke(main.clj:277)         在clojure.main $ initialize.invokeStatic(main.clj:308)         在clojure.main $ null_opt.invokeStatic(main.clj:342)         在clojure.main $ null_opt.invoke(main.clj:339)         在clojure.main $ main.invokeStatic(main.clj:421)         在clojure.main $ main.doInvoke(main.clj:384)         在clojure.lang.RestFn.invoke(RestFn.java:421)         在clojure.lang.Var.invoke(Var.java:383)         在clojure.lang.AFn.applyToHelper(AFn.java:156)         在clojure.lang.Var.applyTo(Var.java:700)         在clojure.main.main(main.java:37) 引起:java.lang.RuntimeException:无法在此上下文中解析符号:flat         在clojure.lang.Util.runtimeException(Util.java:221)         在clojure.lang.Compiler.resolveIn(Compiler.java:7164)         在clojure.lang.Compiler.resolve(Compiler.java:7108)         在clojure.lang.Compiler.analyzeSymbol(Compiler.java:7069)         在clojure.lang.Compiler.analyze(Compiler.java:6648)         ......还有128个

我怀疑它与名称空间有关,但我不知道如何解决它。

1 个答案:

答案 0 :(得分:1)

flat的let绑定中,您引用的是flat,但尚未显示。 fn有一个可选的名称参数,可用于解决此问题。

(defn -main                                                                     
  "I don't do a whole lot ... yet."                                             
  []                                                                            
  (= ((fn [coll]                                                                
        (let [flat (fn flat [coll]                                              
                     (when-let [s (seq coll)]                                   
                       (if (sequential? (first s))                              
                         (concat (flat (first s)) (flat (rest s)))              
                         (cons (first s) (flat (rest s))))))]                   
          (flat coll)))                                                         
      '((1 2) 3 [4 [5 6]]))                                                     
     '(1 2 3 4 5 6))) 

此外,可以在不改变含义的情况下显着简化代码:

(defn -main                                                                     
  "I don't do a whole lot ... yet."                                             
  []                                                                            
  (let [flat (fn flat [[el & els :as coll]]                                     
               (when coll                                                       
                 (if (sequential? el)                                           
                   (concat (flat el) (flat els))                                
                   (cons el (flat els)))))]                                     
    (= (flat [[1 2] 3 [4 [5 6]]])                                               
       [1 2 3 4 5 6])))