以下工作:
((resolve (symbol "first")) [1 2 3])
;; => 1
Run Code Online (Sandbox Code Playgroud)
为什么认为是错误的,
((read-string "first") [1 2 3])
;; => nil
Run Code Online (Sandbox Code Playgroud)
应该工作,但它没有?(我明白了nil。)
来自的返回值(resolve (symbol "first"))可能是clojure.core/first应用于参数的 Var 。
来自的返回值(read-string "first")是first也应用于参数的符号。但是将符号用作函数具有不同的含义。参数应该是一个映射,返回值相当于做(get a-map the-symbol)。
任何实现 的类型clojure.lang.IFn都可以在函数位置。为什么使用符号与向量参数返回一个函数的原因nil,而不是失败,就在于实现细节IFn的Symbol类型(在对元数1这种特殊情况下):
public Object invoke(Object obj) {
return RT.get(obj, this);
}
Run Code Online (Sandbox Code Playgroud)
RT.get()检查是否obj实现ILookup并调用ILookup.valAt()。Clojure 向量确实实现了,ILookup但它们期望一个整数作为提供的键并返回nil其他任何东西。
public Object valAt(Object key, Object notFound){
if(Util.isInteger(key))
{
int i = ((Number) key).intValue();
if(i >= 0 && i < count())
return nth(i);
}
return notFound;
}
public Object valAt(Object key){
return valAt(key, null);
}
Run Code Online (Sandbox Code Playgroud)