当前位置: 首页 > 知识库问答 >
问题:

lein run和REPL之间的不一致行为

司马同
2023-03-14

我是clojure的新手,尝试通过解https://www.4clojure.com上的问题来学习它。任务是实现flatten函数。这是我的实现:

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

当我将其作为lein run运行时,我会得到以下异常:

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

共有1个答案

齐嘉庆
2023-03-14

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])))    
 类似资料:
  • 问题内容: 阅读mozilla文档后,我发现了这一点: 在全局执行上下文中(在任何函数之外),这指的是全局对象,无论是否处于严格模式下。 在玩了一点示波器之后,我发现在node.js REPL中… 但是当我用同一行创建脚本时… 是否有一个原因?还是一个错误? 问题答案: 节点是全局的。文件中的代码位于“模块”中,它实际上只是一个函数。 您的代码文件变成了如下所示的简化示例: 请注意,它是使用来执行

  • 问题内容: 我正在尝试从C#移植算法。我需要做的第一步是获取字节数组的md5。我似乎无法在C#和go实现之间获得一致的哈希值。 在C#中,我可以执行以下操作: 我得到 进行中: 产量: 我是在做一些奇怪的事情,还是实现方式实际上有所不同。我需要能够在旅途中复制C#行为。 我有一些可用的小提琴去和C#的,如果你想检查我的整个实现。 问题答案: 您正在滥用Sum函数的输入。sum的输入参数用于存储输出

  • 新手Clojure和leiningen问题: 鉴于下面我的项目中的代码片段,这可以从lein repl中获得: 生成预期的“命令:某物…正在运行…完成”,但无法从命令行执行: 生成"命令:某物...错误:未作为命令解析" 为什么我怎么修理它? 复制: 然后编辑生成的项目文件,添加以定义主功能,并编辑生成的src/eg/core。clj文件,并将其粘贴到: core.clj 然后 作品(即打印的东西

  • 我似乎对一个简单的时间跟踪器有一个问题。它的设置方式是用户可以跟踪与项目相关的命中时间或自由输入某些内容。这意味着时间表对象总是有一个用户,但并不总是有一个项目。当我在连接到用户的数据库中创建一个时间表对象,但然后将一个与用户没有关联的项目连接到同一个时间跟踪对象时,可能会出现不一致。 解决这个问题的最佳方法是什么。我听说过定向联想,但我不知道它是如何解决问题的

  • 我需要运行 DAXPY 线性代数核的时序。天真地,我想尝试这样的事情: 如果需要,完整的代码链接位于末尾。 问题是,填充操作数 x 和 y 的内存访问将导致它们被放置在处理器缓存中。因此,在 DAXPY 调用中对内存的后续访问比在生产运行中实际访问要快得多。 我比较了两种解决这个问题的方法。第一种方法是通过clflush指令从所有级别的缓存中刷新操作数。第二种方法是读取一个非常大的数组,直到操作数

  • 我编写了下面的代码来弄清楚onTextChanged()方法是如何工作的: 我注意到:当我只打字时,计数非常简单: 现在,如果我添加3个(或更多)数字,然后继续键入字母,就会发生以下情况: 对我来说,输入3位数字似乎会以某种方式改变TextWatcher的行为,使其将之后的所有内容视为Char而不是CharSequence。 对这种行为有什么解释吗?