首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关闭字符串到符号的计算结果是错误的

关闭字符串到符号的计算结果是错误的
EN

Stack Overflow用户
提问于 2016-02-21 20:56:22
回答 1查看 53关注 0票数 2
代码语言:javascript
复制
user=> ((symbol "or") true false)
false
user=> (or true false)
true

为什么第一种形式要评估为false?我认为这两种输入形式是等价的。

奇怪的是,颠倒论点的顺序是有效的:

代码语言:javascript
复制
user=> ((symbol "or") false true)
true
user => (or false true)
true
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-21 21:14:01

计算列表(or true false)时,Clojure首先计算第一个项。在本例中,第一项是命名宏的符号,因此Clojure扩展宏并计算结果数据结构(在本例中为let表单)。

另一方面,当您计算list ((symbol "or") true false)时,Clojure再次计算第一个项,但在本例中,第一个项是另一个列表!该列表的第一个元素是符号symbol,它命名了一个函数,因此Clojure用参数"or"调用该函数,再次生成符号or。换句话说,您基本上是在评估('or true false)

这里有一个问题: Clojure不接受它刚刚评估的东西,然后再对它进行评估。相反,因为它一开始并不是一个符号,Clojure对它进行了计算,然后假设它必须是一个函数。是一种功能吗?事实上,答案是肯定的!

代码语言:javascript
复制
user> (ifn? 'do)
;=> true

这里有点棘手。invokeSymbol类上的实现与Keyword类上的invoke实现相同:它假定第一个参数是一个映射,并试图在该映射中查找自己。如果提供第二个参数,它将使用该参数作为默认值。

现在,很明显,如果您尝试将true看作一个映射,并在该地图中查找符号or,您将什么也找不到。因此,Clojure可以帮助返回您提供的默认值:false。您可以在第二个参数点中放置任何您想要的值,只要您的符号在第一个参数中不作为键存在,您将始终得到默认值。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35541931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档