Clojure “用地图做事”;foreach“;风格号召

Clojure “用地图做事”;foreach“;风格号召,clojure,Clojure,我正在尝试建立Clojure的学习曲线,我正在编写一个简单的程序,可以输出给定字符串的排列列表。我的递归解决方案将多次调用自身(因此存在一个调用树,而不是一维堆栈)。我试图理解,在给定一个列表的情况下,我如何能够多次调用一个函数,每次调用时从列表中给它一个元素。我现在的代码是 (def permuteCat ( fn [string printlist appendval] ( permute string (concat printlist (list appendval))

我正在尝试建立Clojure的学习曲线,我正在编写一个简单的程序,可以输出给定字符串的排列列表。我的递归解决方案将多次调用自身(因此存在一个调用树,而不是一维堆栈)。我试图理解,在给定一个列表的情况下,我如何能够多次调用一个函数,每次调用时从列表中给它一个元素。我现在的代码是

(def permuteCat (
    fn [string printlist appendval]
    ( permute string (concat printlist (list appendval)) )
))

(def permuteRecurse (
    fn [string printlist appendlist]
    (
    map (partial permuteCat string printlist) appendlist
    )
))

(def permute (
    fn [string printlist] 
    (if ( == (count printlist) (.length string) )
        (println printlist)
        ( permuteRecurse string printlist ( range (- (.length string) (count printlist)) ) ) 
    )
)
)
但是,PermuteCarse()似乎从未调用过PermuteCarse()。在像OCaml这样的语言中,我会使用curry permuteCat并使用map操作符,但我知道Clojure本身并不支持curry。做这件事的首选方法是什么?或者我只是偏离了基准,需要采取完全不同的方法吗?

是表示foreach强制执行的惯用方法。 map生成一个惰性序列,因此在使用该序列之前不会执行。您可以使用doseq来编写命令式foreach循环,但更好的是,如果您将序列的创建与希望使用它执行的操作分开(在本例中为打印,但可能以后您希望搜索它)


您可能看不到任何打印的内容,因为map生成了一个惰性序列。通过将对map的调用包装到dorun.Blah中,可以强制惰性序列的迭代。我自己就知道了——我用的是道尔而不是多伦,但效果一样。来自C/Java背景的惰性序列的东西在涉及到副作用时确实抛出了一个曲线球。它们不能很好地处理动态绑定的变量(在计算seq元素时,绑定可能超出范围),并且它们会使堆栈跟踪显示在意外的位置。实时学习!感谢您的输入:Dyou也可以说(取n(迭代置换字符串))之类的话
; specify the sequence
(defn foo [v] (map inc v))

; print it
(doseq [v (foo [1 2 3])]
  (println v))