2024 Clojure状态调查! 分享您的想法。

欢迎!请查看关于 页面以了解更多如何使用此功能的信息。

0
Clojure 用户

大家好,我带着又一个让我困扰的问题回来。

我的程序有两个组件,我想将它们结合起来。

一个是创建了一个有效的查询,我希望对其进行模糊查询。例如,我的程序随机创建以下映射

{:select [:*], :from [:myTable], :join [[:myTable :a1]]}

第二个部分接收表和列名,为每个字符串的不同排列创建文件,如 tables.txt。

我在如何结合它们上遇到了困难。

因此,我读取了两个列表。

table = ("my�able" "+my+my+myyTa�me" "myT+/+///v+/v/le" ...
columns = ("name" "nAmme" ...)

以及一个映射

{:select [:*], :from [:myTable], :join [[:myTable :a1]]}

在替换值后,将去向归一化函数并执行。

那么我该如何以函数式/Clojure风格同时迭代这两个列表并替换值呢?

例如

{:select [:*], :from [:myTable], :join [[:myTable :a1]]}

{:select "name", :from "my�able", :join [[:myTable :a1]]}

{:select "nAmme", :from "+my+my+myyTa�me", :join [[:myTable :a1]]}
以此类推,直到迭代过列表中的每个项目。

我欢迎任何建议!

谢谢!

1 个回答

+1

编辑于

clojure.core/map 函数接受一个函数和多个可序列参数,并将通过将该函数映射到从每个序列中抽取的下一个元素来处理这些序列,例如:

user>(map + [1 2 3] [3 4 5])
(4 6 8)    

因此,您可以直接使用构建查询映射的函数来使用。

(def table ["my�able" "+my+my+myyTa�me" "myT+/+///v+/v/le"])
(def columns ["name" "nAmme"])
(defn process  [table col]
    {:select col :from table :join [[:myTable :a1]]})`

您将得到一个结果序列(在这种情况下,查询映射)。

user> (map process table columns)
({:select "name", :from "my�able", :join [[:myTable :a1]]}
 {:select "nAmme", :from "+my+my+myyTa�me", :join [[:myTable :a1]]})

这对于生成例如随机序列的函数来说工作得很好
表和列,以便您可以从中派生出(可能是无限个)的懒惰序列查询映射
还包括其他选项,使用 reduce、transducers、iterate、循环等
,但我认为对于给定的示例来说,这个方法已经很直接了。

...