请在 2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以获取更多关于如何使用本站的信息。

0
错误

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

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

详细信息

我的函数

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

其中客户是
(
[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)]
)

所以基本上,我想在给函数1时取回(返回值)“John Smith”。

代码

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

祝你的作业顺利!

...