gpt4 book ai didi

通过列表发送时,Clojure 的函数似乎无法按预期工作

转载 作者:行者123 更新时间:2023-12-02 10:59:22 24 4
gpt4 key购买 nike

在 Clojure REPL 中,这个表达式

( #(for [x %] (+ 100 (second x)))  ['(+ 38) '(+ 48)] )

按预期生成 (138 148)

但是这个

( #(for [x %] ((first x) 100 (second x))) ['(+ 38) '(+ 48)] )

产生 (38 48) 这看起来确实很奇怪。

两个表达式确实应该产生相同的结果!我缺少什么?将不胜感激任何解决这个谜团的想法。

顺便说一句,我尝试使用“apply(first x)”并将其余参数打包到列表中,但这似乎并不重要。同样意想不到的结果又回来了。

另外,为了验证 + 确实从输入中得到解析,我向 REPL 提供了以下内容

( #(for [x %] (resolve (first x) )) '((+ 38) (+ 48)) )

产生的

 (#'clojure.core/+ #'clojure.core/+)   as expected.

最佳答案

( #(for [x %] ((first x) 100 (second x))) ['(+ 38) '(+ 48)] )

在此,+ 是一个符号,而不是函数,因为它已在列表中被引用。但是,符号被定义为在作为函数调用时进行映射查找(与关键字相同)。因此 ('+ 100 38)(get 100 '+ 38) 相同。最后一个参数是“如果您在 map 中找不到我想要的东西,请将其返回”。由于 100 不是映射,因此 + 使用该参数作为返回值。

要让它做你想做的事,你有两个选择:

  1. 使用向量而不是带引号的列表可确保 + 得到正确解析。

    ( #(for [x %] ((first x) 100 (second x))) [[+ 38] [+ 48]] )
  2. 请自行解决,以确保使用 + 函数而不是 + 符号。

    ( #(for [x %] ((resolve (first x)) 100 (second x))) ['(+ 38) '(+ 48)] )

关于通过列表发送时,Clojure 的函数似乎无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8557955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com