Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Clojure匿名函数声明伪(未使用)参数_Clojure_Arguments_Anonymous Function - Fatal编程技术网

为Clojure匿名函数声明伪(未使用)参数

为Clojure匿名函数声明伪(未使用)参数,clojure,arguments,anonymous-function,Clojure,Arguments,Anonymous Function,如回答中所述,Clojure通过正文中引用的最大参数索引(例如,如果最大引用参数为%4,则该匿名函数有4个参数)确定匿名函数(通过#()定义)的参数数 问:是否有一些语法告诉Clojure编译器匿名函数需要一个参数,甚至不引用该参数?或者,在这种情况下,唯一的“干净方法”是使用?(*“Clean way”:我知道在大多数情况下,您可以在不影响函数的情况下引用伪参数——请参见下文,但我希望避免这种变通方法。) 我的用例:我有一个函数(defn foo[predicate]),其中predicate

如回答中所述,Clojure通过正文中引用的最大参数索引(例如,如果最大引用参数为
%4
,则该匿名函数有4个参数)确定匿名函数(通过
#()
定义)的参数数

问:是否有一些语法告诉Clojure编译器匿名函数需要一个参数,甚至不引用该参数?或者,在这种情况下,唯一的“干净方法”是使用?(*“Clean way”:我知道在大多数情况下,您可以在不影响函数的情况下引用伪参数——请参见下文,但我希望避免这种变通方法。)

我的用例:我有一个函数
(defn foo[predicate])
,其中
predicate
只需要一个参数,我想用一个总是返回
true
的谓词测试
foo
。(例如,
#(true)
)这会导致一个
算术异常
,因为解释器认为
#(true)
需要零参数

在这种情况下,我可以使用一些聪明的黑客,比如
#(或true%)
,但是:

  • 它几乎和
    fn
    -变体一样需要输入
  • 我感兴趣的是是否有一个通用的解决方案
  • 编辑:所以说得清楚一点,我在找这样的东西:


    #[1](正确);;匿名函数接受一个参数

    否。只需使用
    fn
    。这就是它的用途。

    不。只要使用
    fn
    。这就是它的用途。

    如果它是一个固定回报,您可以使用:

    如果不是,则可以将
    fn
    与rest参数一起使用:

    (fn [& _] 
     some-side-effect-expression)
    ; ==> non functional value
    
    事实上,这可以在不需要所有passs参数的高阶函数上完成:

    (some-fun (fn [a b & _] (+ a b)) '(1 2 3 4 5))
    ; ==> (3 5 7 9)
    

    如果是固定回报,您可以使用:

    如果不是,则可以将
    fn
    与rest参数一起使用:

    (fn [& _] 
     some-side-effect-expression)
    ; ==> non functional value
    
    事实上,这可以在不需要所有passs参数的高阶函数上完成:

    (some-fun (fn [a b & _] (+ a b)) '(1 2 3 4 5))
    ; ==> (3 5 7 9)
    

    如果您坚持使用
    #(…)
    语法,您可以编写

    #(do % true)
    
    。。。无论你想返回什么,都不会招致运行时惩罚

    但是,
    (常为true)
    ,正如建议的那样,是惯用的,并且接受任何参数列表:

    ((constantly true) 1 2 "Buckle my shoe");true
    

    如果您坚持使用
    #(…)
    语法,您可以编写

    #(do % true)
    
    。。。无论你想返回什么,都不会招致运行时惩罚

    但是,
    (常为true)
    ,正如建议的那样,是惯用的,并且接受任何参数列表:

    ((constantly true) 1 2 "Buckle my shoe");true
    

    关于具体问题,而不是一般问题——Clojure 1.9将包括您正在寻找的谓词作为。关于具体问题,而不是一般问题——Clojure 1.9将包括您正在寻找的谓词作为。