【发布时间】:2010-07-06 12:09:21
【问题描述】:
大家好,我开始研究 Clojure 语言,并且对我正在尝试做的事情有几个问题。广泛的目标是将序列函数every? 别名为all?。我确定有一个函数或宏可以做别名(或类似的东西),但我想看看到目前为止我所知道的一些基本结构是否可行。我的方法是定义一个名为all? 的函数,将其参数应用于every? 实现。
我很想知道这是否可以变得不可知,所以我想为我的别名函数提供参数以获取两个参数,新名称(作为关键字)和旧名称(作为函数引用)。在朝着这个目标努力的过程中,我遇到了两个问题。
1) 使用关键字定义命名函数会引发错误。显然它想要clojure.lang.IObj。
user=> (defn :foo "bar")
java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to clojure.lang.IObj (NO_SOURCE_FILE:0)
是否有将关键字转换为 IObj 的函数,或其他方法来参数化具有某些提供值的新定义函数的名称? (在 Ruby 中,define_method 以及其他技术可以做到这一点)
irb(main)> self.class.instance_eval do
irb(main)* define_method(:foo) { "bar" }
irb(main)> end
=> #<Proc>
irb(main)> foo
=> "bar"
2) 将函数的所有参数收集到一个变量中。甚至像(+ 1 2 3 4) 这样的基本函数也接受可变数量的参数。到目前为止,我所看到的所有函数定义技术都采用特定数量的参数,无法将列表中的所有内容聚合起来以便在函数体中进行处理。再一次,我要在 Ruby 中完成,如下所示:
irb(main)> def foo(*args)
irb(main)> p args
irb(main)> end
=> nil
irb(main)> foo(1, 2, 3)
[1, 2, 3]
=> nil
感谢您为我提供的任何帮助!
【问题讨论】:
标签: clojure