当通过列表发送时,Clojure的func似乎没有按预期工作

Don*_*Don 4 clojure

在Clojure REPL中,这个表达式

( #(for [x %] (+ 100 (second x)))  ['(+ 38) '(+ 48)] )
Run Code Online (Sandbox Code Playgroud)

按预期产生(138 148)

但是这个

( #(for [x %] ((first x) 100 (second x))) ['(+ 38) '(+ 48)] )
Run Code Online (Sandbox Code Playgroud)

产生(38 48)这似乎真的很奇怪.

这两个表达式确实应该产生相同的结果!我错过了什么?将欣赏任何解决这个谜团的想法.

顺便说一下,我尝试使用'apply(first x)'并将其余的args打包成一个列表,但似乎并不重要.同样意外的结果又回来了.

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

( #(for [x %] (resolve (first x) )) '((+ 38) (+ 48)) )
Run Code Online (Sandbox Code Playgroud)

哪个产生了

 (#'clojure.core/+ #'clojure.core/+)   as expected.
Run Code Online (Sandbox Code Playgroud)

man*_*nge 10

( #(for [x %] ((first x) 100 (second x))) ['(+ 38) '(+ 48)] )
Run Code Online (Sandbox Code Playgroud)

在这里,它+是一个符号,而不是一个函数,因为它已在列表中引用.但是,符号被定义为在作为函数调用时进行映射查找(与关键字相同).所以('+ 100 38)是一样的(get 100 '+ 38).最后一个论点是"如果你在地图中找不到我想要的东西,那就回归".由于100不是地图,因此+使用该参数作为返回值.

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

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

    ( #(for [x %] ((first x) 100 (second x))) [[+ 38] [+ 48]] )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 自己解决它以确保您使用+函数而不是+符号.

    ( #(for [x %] ((resolve (first x)) 100 (second x))) ['(+ 38) '(+ 48)] )
    
    Run Code Online (Sandbox Code Playgroud)

  • +1详细说明.由于问题实际上在引用中,因此您不需要更改数据结构,列表也可以正常工作.你只需要删除文字形式并使用例如`(list + 38)` (3认同)