Clojure:在函数调用中使用 If 语句作为参数,如果没有参数,则不传递任何内容

Clojure: using an If statement as a parameter in a function call, if there are no args, pass nothing

所以我有一个函数 do_stuff 可以接受 0 或 1 个参数,如下所示

(defn do_stuff 
   ([]
    (println "no arguments here"))
   ([arg]
    (println "here's the argument"))

(defn -main
  [& args]
  (do_stuff (if args (apply str args))

如何 return if 语句中没有参数,以便打印“此处无参数”字符串? 编辑:使用 when 而不是 if returns nil,这仍然是一个论点?

使用 multi-arity 定义

-main 上应用你从 do_stuff 中学到的教训:

(defn -main
  ([] (do_stuff))
  ([& args] (do_stuff (apply str args))))

使用 if(或 cond)外化条件

没有 else 分支的 if 表达式仍然是 returns nil 但返回 nil 并不是什么都不返回。 也就是说,您不能使用 ifwhen 表达式使它只是 returns 什么都没有。至少不是像 Clojure 这样的函数式语言。

您也可以像这样外化您的 if

(defn -main
  [& args]
  (if args 
     (do_stuff (apply str args))
     (do_stuff)))

使用apply

@EugenePakhomov 的想法:

(defn -main
  [& args]
  (apply do_stuff (if args [(apply str args)] [])))

但我的想法是:将 (apply str args) 部分放在 do_stuff 中怎么样?

(defn do_stuff 
   ([]
    (println "no arguments here"))
   ([& args]
    (let [arg (apply str args)]
      (println "here's the argument"))))

因为那样你就可以非常优雅地做到:

(defn -main [& args]
  (apply do_stuff args))