在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不是地图,因此+使用该参数作为返回值.
要使它做你想做的事,你有两个选择:
使用向量而不是带引号的列表可确保+正确解析.
( #(for [x %] ((first x) 100 (second x))) [[+ 38] [+ 48]] )
Run Code Online (Sandbox Code Playgroud)自己解决它以确保您使用+函数而不是+符号.
( #(for [x %] ((resolve (first x)) 100 (second x))) ['(+ 38) '(+ 48)] )
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |