Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure功能与方法的设计理念_Clojure_Reusability - Fatal编程技术网

Clojure功能与方法的设计理念

Clojure功能与方法的设计理念,clojure,reusability,Clojure,Reusability,人们经常引用这句话 “让100个函数在一个数据结构上运行比让10个函数在10个数据结构上运行要好。”-Alan Perlis 这在Clojure中是很常见的&它的库也是如此,例如 在本文中,Rich解释了clojure.xml的设计原则,其中,一旦读取xml文件,它将转换为映射,然后您就可以使用所有函数来处理这些映射,无论您需要什么,并且您可以将这些函数与其他映射重用 我很难理解这些函数是如何实现的,以操作表示XML的映射,以便在其他地方使用 我的意思是,我编写的100个函数不是特定于XML域(

人们经常引用这句话

“让100个函数在一个数据结构上运行比让10个函数在10个数据结构上运行要好。”-Alan Perlis

这在Clojure中是很常见的&它的库也是如此,例如

在本文中,Rich解释了
clojure.xml
的设计原则,其中,一旦读取xml文件,它将转换为映射,然后您就可以使用所有函数来处理这些映射,无论您需要什么,并且您可以将这些函数与其他映射重用

我很难理解这些函数是如何实现的,以操作表示XML的映射,以便在其他地方使用

我的意思是,我编写的100个函数不是特定于XML域(即特定于XML的映射模式)吗?因此,如果映射遵循相同的模式,那么这些fn的唯一重用就是

我遗漏了什么吗?

来自:

看看
clojure.xml
处理xml的方式——它处理一个外部实体,一个面向某个xml源的SAX解析器,从中获取数据并将其映射到一个映射中,就完成了。没有,也不会有更多特定于XML的函数。操作贴图的函数世界现在将应用。如果有必要拥有更多类似XQuery的功能来处理XML应用程序,那么这些功能通常都是为地图而构建的,并且可以在所有地图上使用和重用。这与典型的XMLDOM形成对比,XMLDOM是一个巨大的函数集合,在其他任何地方都是有用的

我编写的100个函数不是特定于XML域吗? 没有

因为您将不再处理XML了。XML仅仅是一种标记语言。在其他语言生态系统(比如Java)中,当有人提到XML时,它意味着标记语言和(几乎总是)它的扩展以及围绕它们构建的工具。Clojure(至少
Clojure.xml
)处理xml的方式是读取数据,然后在Clojure的本地映射中继续处理它



值得注意的是(到目前为止)只包含一个函数,
parse
。这意味着它不支持序列化为XML,也不支持就地编辑XML数据元素。

我认为您将XML与XML文件的特定实例混淆了

给定一个特定的XML文件,例如:

<xml>
<node1>One</node1>
<node2>Two</node1>
<node3>
  <node31>
    ThreeOne
  </node31>
  <node32>
    ThreeTwo
  </node31>
</node1>
</xml>

一个
两个
三一
三二
确实,例如,您可能希望使用逻辑从
node3
下的子节点获取值。因此,您可能需要一个名为
获取三节点子值的函数
。如果另一个XML具有不同的结构,并且没有像上面的XML那样具有子节点3,那么该函数将无法重用

但这并不是Rich所说的被重用的功能。被重用的函数是用于实现
获取三个节点子值的逻辑的函数。因为如果您拥有的是一个XML对象,那么该XML对象将需要一个方法来获取节点3,另一个方法来获取该节点的子节点,另一个方法来获取该节点的值。所有这些方法只适用于对象的XML类,必须为此编写。但是,如果将XML转换为映射,则根本不需要这些方法,也不需要实现它们。因为地图已经有了在其节点上导航和循环的方法


希望这能让事情变得更清楚。

以我的理解,例如,您可以筛选出符合特定条件的特定字段的地图列表。filter函数可以用于源于XML的映射,也可以用于其他上下文,如过滤JSON数组中的数据等。核心功能不应该关注用户操作的数据的
形式,而应该关注表示核心业务逻辑的内置数据结构。