【问题标题】:find about about the type of function parameters查找有关函数参数类型的信息
【发布时间】:2010-09-22 12:11:46
【问题描述】:

我能找到所有采用特定类型参数的函数/宏吗?

例如,什么函数接受命名空间对象作为参数?

(这是因为我可以创建一个命名空间并将其存储在一个 var 中,但我不知道我可以在哪里使用该 var;我可以将该 var 传递给什么函数?)

这里有一些代码:

user=> (def working-namespace (create-ns 'my-namespace))
#'user/working-namespace
;i created a namspace and want to use it later

user=> (class working-namespace)
clojure.lang.Namespace
; out of curiosity i found out that "working-namespace" is a Namespace object

user=> (ns working-namespace)
nil
working-namespace=>
; but how do i switch to it ? this didn't do what i wanted...

user=> (refer working-namespace)
java.lang.ClassCastException: clojure.lang.Namespace cannot be cast to clojure.lang.Symbol (NO_SOURCE_FILE:0)
; this did not work either as my expectations

user=> (the-ns working-namespace)
#<Namespace my-namespace>
user=> (class (the-ns working-namespace))
clojure.lang.Namespace
; great, this gave me the same thing, a Namespace

因此问题是:我如何动态使用它(这就是我将命名空间放入 var 的原因)?我如何从指向命名空间的 var 中获得对我有用的东西?

我可以尝试四处寻找利用命名空间对象或将其转换为其他东西的函数。我做了并且只找到了“实习生”。手动搜索似乎没有那么有希望

如果我有一百万次遇到这个问题怎么办?有没有一种自动化的方法可以让我得到我正在寻找的东西,而不必每次都四处询问?

【问题讨论】:

  • 如果您解释您要完成的工作,而不是询问如何执行某个实现,您可能会得到更有用的答案,因为后者可能存在固有缺陷或排除了对前者的更好解决方案。例如,问如何过河,而不是如何建造一座桥。
  • 为什么不用 clojure 脚本检查源代码 ;)?
  • @Alex Taggart:好的,用示例创建了一个更详细的用例。怎么办 ? :P

标签: function parameters clojure types


【解决方案1】:

在 Clojure 1.2 和以前的函数参数中没有类型。 每个函数参数都是一个对象。所以问题真的变成了“我如何找到将我传递的对象转换为这种类型的函数。所以搜索类型提示会找到其中的一些,尽管它不会让你得到所有东西。我希望它更有可能回答这个问题一般。

从 1.3(当前开发分支 9/2010)开始,函数参数和返回类型可以具有定义的类型,并将作为该类型传递/返回,而不是强制转换为对象,然后再强制转换。这会从数值函数的执行时间中删除一个零,其重要限制是它仅适用于:静态函数并且仅适用于直接调用(即:不通过 map/reduce/filter/etc. ) 虽然它有一个重要的突破性变化,即默认情况下不再装箱整数并且整数(实际上是 Long)溢出引发异常,但没有太多关于此更改的发布。你可以阅读更多here

(defn ^:static fib ^long [^long n]
  (if (<= n 1)
    1
    (+ (fib (dec n)) (fib (- n 2)))))

所以在 1.3 发布并被广泛采用后,您将看到具有更常用定义类型的代码,因为它们将提供很大的速度优势,然后您将能够按参数类型找到更多函数,尽管它们仍然不是全部。

在我了解函数参数类型的同一讲座中,Rich 提到了遥远的 Clojure 未来(在“Clojure 中的 Clojure”之后)的计划,即更好地支持将编译器内部结构暴露给 IDE 等工具。所以希望有一天你会得到这个问题的真正答案。 动态语言使这在实践中稍微困难,在理论上更难。

【讨论】:

  • 我正在寻找描述添加函数参数的书面资料。这篇文章基于 Rich Hickey 在 2010 年 9 月 20 日在湾区 Clojure 聚会上的演讲
【解决方案2】:

您已经从 Arthur 那里得到了很好的答案,所以我只会回答“我如何从指向命名空间的 var 中获得对我有用的东西?”。从(doc ns),请注意它说未评估

user=> (doc ns)
-------------------------
clojure.core/ns
([name docstring? attr-map? references*])
Macro
  Sets *ns* to the namespace named by name (unevaluated), creating it

现在,如果您愿意,可以使用 in-ns 做一些事情(整个命名空间对象 -> 字符串 -> 符号转换可能很愚蠢,但足以说明我的观点):

user=> (in-ns (symbol (str working-namespace)))
#<Namespace my-namespace>
my-namespace=>

【讨论】:

    【解决方案3】:

    我认为如果没有大量使用动态语言的技巧,您将无法做到这一点。如果你现在想知道使用命名空间的函数,请查看命名空间内容的文档。

    例如清理命名空间或重新加载它们。

    【讨论】:

    • 这非常困难、耗时且没有那么有回报。我已经为 Namespace 类做到了,但没有取得太大的成功。
    【解决方案4】:

    你写道:

    用户=>(ns 工作命名空间) 零 工作命名空间=> ;但我如何切换到它?这没有做我想要的......

    但是您确实切换到了working-namespace 命名空间(这就是提示更改的原因),所以我不清楚“您想要什么”。

    正如我之前提到的,您需要提出您要解决的最终问题。搞乱命名空间对象很可能不是解决方案。

    【讨论】:

    • 我想改成“my-namespace”
    猜你喜欢
    • 2016-12-28
    • 2012-11-18
    • 2011-10-04
    • 1970-01-01
    • 2021-01-20
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多