簡體   English   中英

lein run和REPL之間的行為不一致

[英]Inconsistent behaviour between lein run and REPL

我是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))) 

當我像(-main)一樣在REPL中運行它時,我會成真。

當我以lein run的方式運行它時, 出現以下異常:

線程“主”中的異常java.lang.RuntimeException:無法解析符號:在此上下文中是flat,在clojure.lang.Compiler.analyze(Compiler.java:6688)上編譯:(clojure_noob / core.clj:11:42)在clojure的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.lang.Compiler.analyze(Compiler.java:6625)的lang.Compiler.analyze(Compiler.java:6669)位於clojure.lang.Compiler的clojure.lang.Compiler $ InvokeExpr.parse(Compiler.java:3834)位於clojure.lang.Compiler.analyze(Compiler.java:6669)處於clojure.lang.Compiler.analyze(Compiler.java:6625)處於clojure.lang.Compiler $ IfExpr $ Parser的.analyzeSeq(Compiler.java:6870)。在clojure.lang.Compiler.java.2ly.parse(Compiler.java:2797)在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)在clojure.lang.Compiler.java.6ly) :6625),位於clojur的clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001) e.lang.Compiler $ LetExpr $ Parser.parse(Compiler.java:6319)at clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)at clojure.lang.Compiler.analyze(Compiler.java:6669)at clojure .lang.Compiler.analyzeSeq(Compiler.java:6856)位於clojure.lang.Compiler.analyze(Compiler.java:6669)位於clojure.lang.Compiler.analyze(Compiler.java:6625)在clojure.lang.Compiler $位於Clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)的BodyExpr $ Parser.parse(Compiler.java:6001)位於clojure.lang.Compiler.analyze的Clojure.lang.Compiler.analyze(Compiler.java:6669) (在clojure.lang.Compiler $ IfExpr $ Parser.parse(Compiler.java:2797)在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)在clojure.lang.Compiler.analyze(Compiler.java:6625)在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)在clojure.lang.Compiler.analyze(Compiler.java:6669)在clojure.lang.Compiler.analyze(Compiler.java:6625) )在clojure.lang.Compiler $ LetExpr $ Parser處的clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)。 在clojure.lang.Compiler.analyze(Compiler.java:6669)在clojure.lang.Compiler.analyzeSeq(Compiler.java)處在clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)處進行解析(Compiler.java:6319) :6856)at clojure.lang.Compiler.analyze(Compiler.java:6669)at clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)at clojure.lang.Compiler.analyze(Compiler.java:6669)at clojure位於clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)的clojure.lang.Compiler $ FnMethod.parse(Compiler.java:5380)的.lang.Compiler.analyze(Compiler.java:6625) clojure.lang.Compiler $ FnExpr.parse(Compiler.java:3972)at clojure.lang.Compiler.analyzeSeq(Compiler.java:6866)at clojure.lang.Compiler.analyze(Compiler.java:6669)at clojure.lang在clojure.lang.Compiler.analyzeSeq(Compiler.java:6856)在clojure.lang.Compiler.access $ 300(Compiler.java:38)處clojure.lang.Compiler $ LetExpr clojure.lang的$ Parser.parse(Compiler.java:6269)在clojure.lang的Compiler.analyzeSeq(Compiler.java:6868) .cloilre.lang.Compiler.analyze(Compiler.java:6669)在clojure.lang.Compiler.analyze(Compiler.java:6856)在clojure.lang.Compiler.analyze(Compiler.java:6669)在clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)在clojure.lang.Compiler $ FnMethod.parse(Compiler.java:5380)在clojure.lang.Compiler $ FnExpr位於clojure.lang.Compiler.analyzeSeq(Compiler.java:6866)的.parse(Compiler.java:3972)位於clojure.lang.Compiler.analyze(Compiler.java:6669)的clojure.lang.Compiler.analyzeSeq(Compiler。 java:6856)at clojure.lang.Compiler.analyze(Compiler.java:6669)at clojure.lang.Compiler.analyze(Compiler.java:6625)at clojure.lang.Compiler $ InvokeExpr.parse(Compiler.java:3766) )在clojure.lang.Compiler.analyze(Compiler.java:6669)在clojure.lang.Compiler.analyzeSeq(Compiler.java:6870)在clojure.lang.Compiler.analyze(Compiler.java:6625)在clojure.lang .cloilre.lang.Compiler.analyzeSeq(Compiler.java:686處的.Compiler $ HostExpr $ Parser.parse(Compiler.java:1009) 8)在clojure的clojure.lang.Compiler.analyze(Compiler.java:6625)在clojure.lang.Compiler.analyzeSeq(Compiler.java:6863)在clojure.lang.Compiler.analyze(Compiler.java:6625)在Clojure。位於clojure.lang.lang.Compiler.analyze(Compiler.java:6625)的lang.Compiler.analyze(Compiler.java:6669)位於clojure.lang.Compiler $ BodyExpr $ Parser.parse(Compiler.java:6001)位於clojure.lang .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.analyze(Compiler.java:6669)在clojure.lang.Compiler.access $ 300(在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:6 931)位於clojure.lang.RT.loadResourceScript(RT.java:372)的clojure.lang.RT.loadResourceScript(RT.java:372)的clojure.lang.Compiler.load(Compiler.java:7379)。 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)at 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.lang $ apply.invokeStatic(core.clj:648)的clojure.lang.RestFn.applyTo(RestFn.java:142)的clojure.core $ load_lib.doInvoke(core.clj:64817) $ 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 $ requ ire.invokeStatic(core.clj:5796)at clojure.core $ require.doInvoke(core.clj:5796)at clojure.lang.RestFn.invoke(RestFn.java:408)at user $ eval1036 $ fn__1038.invoke(form -在用戶$ eval1036.invokeStatic(form-init8418556840412273777.clj:1)在用戶$ eval1036.invoke(form-init8418556840412273777.clj:1)在clojure.lang.Compiler.eval(Compiler.java: 6927)在clojure.lang.Compiler.loadFile(Compiler.java:7317)在clojure.lang.Compiler.load(Compiler.java:7379)在clojure.lang.Compiler.load(Compiler.java:7379)在clojure。在clojure.main $ init_opt.invokeStatic(main.clj:277)在clojure.main $ init_opt.invoke(main.clj:277)在clojure.main $ initialize.invokeStatic在main $ load_script.invokeStatic(main.clj:275) (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:無法解析符號:在此上下文中,處於clojure.lang.Util.runtimeException(Util.java:221)處於clojure.lang.Compiler.resolveIn(Compiler.java:7164)處處於平坦狀態Clojure.lang.Compiler.analyzeSymbol(Compiler.java:7069)的Clojure.lang.Compiler.analyze(Compiler.java:6648)的.Compiler.resolve(Compiler.java:7108)... 128更多

我懷疑它與名稱空間有關,但我不知道如何解決它。

flat的let綁定內部,您引用的是flat ,尚不可見。 fn有一個可選的name參數,可用於解決此問題。

(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])))    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM