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

欢迎!有关如何使用本网站的更多信息,请参阅关于页面。

0
错误

你好!
我正在编写一个脚本,不理解这个错误的意义。

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

详细信息

我的函数:

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

其中customer是
(
[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中测试最内层的形式,确保它们工作,然后移动到下一层外层形式。

by
没有额外的括号层。我想进行的操作很复杂...
我必须在列表中找到一个id,并提取名称(向量的列表中的第一个元素)。就像我说的那样,"getnameonly"函数内的代码在外部工作。然而,不知何故,在函数内部,它返回了上述错误。
我真的很需要在函数中这样做,因为我将在整个作业中使用这种逻辑...我到处查看,并且关于这个错误有很多不同的解释。到目前为止,我还没有找到解决方案。
by
当我执行这一行时
(println (nth ((nth (filter #(= 1 (first %)) customers) 0) 1) 0))

它给了我
John Smith
+1
by

有趣的是,你那里得到的不是错误,而是一个对象(!)正如它所说的。(

我可能写成这样,基于你提供的形状

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"

祝你的作业顺利!

...