2024 Clojure 状况调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解这方面的一些更多信息。

0
错误

你好!
我在编写一个脚本,我不明白这个错误是什么意思。

我的函数接受一个数字(id),并从我的向量中提取列表的第一个元素。

详细信息

我的函数

 (defn getnameonly [number] 
  (doall (nth (
        (nth 
         (filter #(= number (first %)) customers) 
         0) 
        1) 
       0))
  )

其中客户为
(
[]
[]
[]
)

所以基本上,如果我想让函数返回“John Smith”,我可以给函数传入1。

代码

(nth (
            (nth 
             (filter #(= number (first %)) customers) 
             0) 
            1) 
           0))

在函数外面运行没有问题。然而,当我调用

(println getnameonly 1)

#object[db$getnameonly 0x66908383 db$getnameonly@66908383] 1

您有什么想法为什么以及如何解决这个问题吗?

2 个答案

+1

首先——那是不是一个额外的括号层?请记住,括号不是被动的分组标记。每一层括号意味着“将其作为函数执行”。

其次——建议自下而上开发代码,并从内部向外调试。尝试在一个 REPL 中测试最内层的表达式,确保它们工作,然后移动到下一层外部的形式。

没有更外层的括号层。我想执行的操作很复杂...
我必须在我的列表中查找一个id,并提取出名字(向量内的列表的第一个元素)。如我所说,函数 "getnameonly" 内部的代码块在外面工作。然而,出于某种原因,在函数内部,它返回了上面显示的错误。
我真的需要将其放在函数中,因为我将在整个作业中工作这个逻辑...我在各个地方都检查了,对于这个错误有各种各样的解释。到目前为止,我没有找到解决我问题的方案。
当我执行这一行时
(println (nth ((nth (filter #(= 1 (first %)) customers) 0) 1) 0))

它给我的是
John Smith
+1

有趣的是,你得到的不是一个错误,它实际上是一个 object (!) 如其所示。(

鉴于你提供的形状,我可能会这样写

user> (def customers '([1 ("John Smith" "123 Here Street" "456-4567")]
                       [2 ("Sue Jones" "43 Rose Court Street" "345-7867")]
                       [3 ("Fan Yuhong" "165 Happy Lane""345-4533")]))
#'user/customers
user> customers
([1 ("John Smith" "123 Here Street" "456-4567")]
 [2 ("Sue Jones" "43 Rose Court Street" "345-7867")]
 [3 ("Fan Yuhong" "165 Happy Lane" "345-4533")])
user> (defn id->name
        [customers id]
        (->> (filter #(= id (first %)) customers)
             (first)
             (second)
             (first)))
#'user/id->name
user> (id->name customers 3)
"Fan Yuhong"
user> (id->name customers 2)
"Sue Jones"
user> (id->name customers 1)
"John Smith"

祝你的作业好运!

...