Clojure:将字符串转换为函数

bla*_*ned 1 clojure

以下工作:

((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。)

jua*_*rro 5

来自的返回值(resolve (symbol "first"))可能是clojure.core/first应用于参数的 Var 。

来自的返回值(read-string "first")first也应用于参数的符号。但是将符号用作函数具有不同的含义。参数应该是一个映射,返回值相当于做(get a-map the-symbol)

任何实现 的类型clojure.lang.IFn都可以在函数位置。为什么使用符号与向量参数返回一个函数的原因nil,而不是失败,就在于实现细节IFnSymbol类型(在对元数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)