所有,我开始看看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)
Run Code Online (Sandbox Code Playgroud)
是否有一个函数将关键字强制转换为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"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
感谢您提供的任何帮助!
clojure ×1