Loops 在未知数量的集合上写入嵌套的doseq

Loops 在未知数量的集合上写入嵌套的doseq,loops,clojure,Loops,Clojure,我有一个文件列表,每行有一个字符序列。每一行都标有一个类别,即“C”。例如: C: w r t y i o p s d f g h j k l z b n m V: a e i o u E: n m ng 我想使用doseq打印C、V和E的每个组合(或者可能只是C和V、C和E等),但一般来说,我在编译时不知道嵌套的集合 即 我的代码字生成器.clj (ns word-generator ) (use 'clojure.string) (import 'java.io.File) (use 'c

我有一个文件
列表
,每行有一个字符序列。每一行都标有一个类别,即“C”。例如:

C: w r t y i o p s d f g h j k l z b n m
V: a e i o u
E: n m ng
我想使用
doseq
打印C、V和E的每个组合(或者可能只是C和V、C和E等),但一般来说,我在编译时不知道嵌套的集合

我的代码
字生成器.clj

(ns word-generator )
(use 'clojure.string)
(import 'java.io.File)
(use 'clojure.java.io)

(defn get-lines [fname]
  (with-open [r (reader fname)]
    (doall (line-seq r))))

(defn get-list [x lines]
  (first (remove nil?
  (for [num  (range (count lines)) ]
   (if (= (first(split (nth lines num) #"\s+")) x)
     (rest(split (nth lines num) #"\s+")))))))

(def sounds(get-lines "LIST")) ;; get the list


(def C (get-list "C:" sounds)) ;; map consonants 
(def V (get-list "V:" sounds)) ;; map vowels
(def E (get-list "E:" sounds)) ;; map end consonants
(def LI "CVE") ;; word structure 


(defn word-runner[carry args depth]
  (doseq [x C y V z E] (println (str x y z)))) ;; iterate and make the words

(defn runner[]
  ( (print "enter arg list: ")
    (def INPUT (read-line))
    (word-runner "" INPUT 0)))

如何实现
wordrunner
,使
doseq
在文件中找到的所有字符序列上进行嵌套循环,但在编译时不知道文件中的行数?

这实际上是组合学的问题,而不是太多的循环。使用库中的
笛卡尔乘积
函数解决您的问题

;;“word runner”的替代实现
(defn打印笛卡尔产品[&序号]
(doseq[combs(应用笛卡尔积序列)]
(println(应用str梳)))

您的
word runner
函数的
carry
参数代表什么?在C
函数(carry-args-depth)中,如果(args[depth]==args.length)打印carry+character-else函数(carried-args-depth+1),它的工作原理是这样的
carry只是用来构建字符串,但是在clojure中有更聪明的方法。在clojure中,您可以省略
carry
depth
word runner
可以类似于
(定义word runner[标签]…)
。那么您希望
wordrunner
函数返回什么呢。例如,
(wordrunner[“CV”“CVE]”)应该返回一个映射或一个向量向量?它应该像这样一起生成列表
wa-we-wo-wu
等等,因为这个代码会导致以下输出,而我不知道如何使它工作
(“w”“r”“t”“y”“I”“o”“p”“s”“d”“f”“g”“h”“k”“l”“z”“b”“n”“m”)(“a”“e”“i”“o”“u”)nil
你说的“如何让它工作”是什么意思?在我看来,你需要修改你的程序。您需要学习更多Clojure基础知识,而不是端口C代码。
(ns word-generator )
(use 'clojure.string)
(import 'java.io.File)
(use 'clojure.java.io)

(defn get-lines [fname]
  (with-open [r (reader fname)]
    (doall (line-seq r))))

(defn get-list [x lines]
  (first (remove nil?
  (for [num  (range (count lines)) ]
   (if (= (first(split (nth lines num) #"\s+")) x)
     (rest(split (nth lines num) #"\s+")))))))

(def sounds(get-lines "LIST")) ;; get the list


(def C (get-list "C:" sounds)) ;; map consonants 
(def V (get-list "V:" sounds)) ;; map vowels
(def E (get-list "E:" sounds)) ;; map end consonants
(def LI "CVE") ;; word structure 


(defn word-runner[carry args depth]
  (doseq [x C y V z E] (println (str x y z)))) ;; iterate and make the words

(defn runner[]
  ( (print "enter arg list: ")
    (def INPUT (read-line))
    (word-runner "" INPUT 0)))