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)))