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

欢迎!请参阅关于页面以了解有关此内容的更多信息。

0
错误

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

我的函数(名为iden%)接受一个数字(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
作者:

有趣的是,你得到的不是一个错误,它是一个!(

我可以根据你提供的形状写成这样

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"

祝你作业顺利!

...