当前位置: 首页 > news >正文

Clojure语言的函数实现

Clojure语言函数实现详解

引言

Clojure是一种基于Java虚拟机的函数式编程语言,以其简洁和强大的数据处理能力而著称。在Clojure中,函数是基本的构造块,良好的函数设计可以提高代码的可复用性和可维护性。本文将深入探讨Clojure中的函数实现,包括函数的定义、参数处理、作用域、闭包、递归及高阶函数等内容。

1. 函数的定义

在Clojure中,定义一个函数使用defn宏。defn的基本语法如下:

clojure (defn 函数名 "文档字符串(可选)" [参数列表] 表达式)

示例

clojure (defn square [x] (* x x))

在这个示例中,我们定义了一个名为square的函数,它接受一个参数x并返回它的平方。文档字符串可以为函数提供描述,有助于使用时理解函数的用途。

2. 参数的处理

Clojure函数支持默认参数、可变参数和命名参数。下面分别介绍这几种参数处理方式。

2.1 默认参数

可以通过在参数列表中指定默认值来实现默认参数。

clojure (defn greet ([name] (greet name "Hello")) ([name greeting] (str greeting ", " name "!")))

在这个例子中,当只传入一个参数name时,函数会使用默认的greeting值“Hello”。

2.2 可变参数

Clojure的函数允许使用可变参数,通过在参数列表的最后加上&符号来实现。这种参数会被收集到一个列表中。

clojure (defn sum [& nums] (reduce + nums))

这个summ函数接受任意数量的参数并返回它们的和。

2.3 命名参数

Clojure还支持命名参数的功能,这种方式可以用map结构传递参数。对于需要提供多个可选参数的函数,这种方式尤其有效。

clojure (defn configure [{:keys [host port timeout]}] (str "Connecting to " host " on port " port " with timeout " timeout))

这个函数接受一个包含hostporttimeout的map,并返回连接的描述信息。

3. 作用域

Clojure中的函数作用域是非常重要的概念。局部变量可以在函数内部定义,而不会影响到外部环境。使用let可以创建局部绑定。

示例

clojure (defn calculate [x y] (let [sum (+ x y) product (* x y)] [sum product]))

在这个示例中,sumproduct是局部变量,它们只能在calculate函数内部使用。

4. 闭包

Clojure支持闭包,这意味着一个函数可以“记住”它的作用域中的变量。闭包是函数式编程的一个基本特性。

clojure (defn make-adder [x] (fn [y] (+ x y)))

在这个例子中,make-adder函数返回一个新的函数,这个函数可以记住和使用其创建时的x值。

5. 递归

Clojure支持递归函数。为了防止无限递归,我们通常需要定义一个递归的出口条件。

clojure (defn factorial [n] (if (zero? n) 1 (* n (factorial (dec n)))))

这个factorial函数计算给定数字的阶乘,使用了递归来实现。

6. 高阶函数

Clojure中的高阶函数是指接受一个或多个函数作为参数,或者返回一个函数作为结果的函数。例如,mapfilterreduce都是高阶函数。

6.1 map

map函数用于对集合中的每个元素应用给定函数。

clojure (def nums [1 2 3 4 5]) (map square nums) ;; 返回 (1 4 9 16 25)

6.2 filter

filter函数用于选择符合条件的元素。

clojure (defn even? [n] (zero? (mod n 2))) (filter even? nums) ;; 返回 (2 4)

6.3 reduce

reduce函数将给定函数应用于集合中的每个元素,并返回一个累积结果。

clojure (reduce + nums) ;; 返回 15

7. 函数式编程的优势

Clojure作为一门函数式编程语言,具有许多优势,包括:

  1. 不可变性: Clojure的数据结构是不可变的,这降低了状态变化引起的bug。
  2. 简洁性: 可以用简洁的函数组合实现复杂的功能。
  3. 良好的并发支持: 函数式编程自然地支持并发,Clojure提供了多种并发工具使得并发编程变得容易。
  4. 代码可读性: 函数式编程鼓励编写小而专一的函数,增强了代码的可读性。

8. 实际应用中的函数设计

在实际项目中,设计函数时需要考虑多个方面,例如函数的可复用性、可测试性和文档化程度。

  • 可复用性: 函数应该尽量实现单一功能,避免过于复杂的逻辑。
  • 可测试性: 为函数编写单元测试可以提高代码的稳定性,确保每个功能模块的正确性。
  • 文档化: 通过文档字符串解释函数用途、参数及返回值,可以帮助其他开发者更快地理解代码。

9. Clojure生态系统中的函数

在Clojure的生态系统中,有众多库和工具都依赖于函数式设计。例如,core.async库通过使用渠道和异步操作来增强并发编程的能力。在使用这些库时,了解Clojure函数的实现原理将会帮助开发者更好地利用这些工具。

10. 结论

Clojure作为一门现代的函数式编程语言,通过其独特的函数特性和设计理念,鼓励开发者编写简洁且高效的代码。本文详细介绍了Clojure中的函数实现,包括定义、参数处理、作用域、闭包、递归和高阶函数,并探讨了在实际应用中的函数设计。了解并掌握这些内容,对于提高Clojure程序员的技能水平至关重要。希望这篇文章能帮助您在Clojure的学习和开发中更进一步。

相关文章:

Clojure语言的函数实现

Clojure语言函数实现详解 引言 Clojure是一种基于Java虚拟机的函数式编程语言,以其简洁和强大的数据处理能力而著称。在Clojure中,函数是基本的构造块,良好的函数设计可以提高代码的可复用性和可维护性。本文将深入探讨Clojure中的函数实现…...

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境,用的是比较老的rabbitmq安装包,如下所示。经过一番折腾,死活服务起不来,最终果断放弃老版本启用新版本。现在把折腾过程记录下: 一、安装erlang 安装完成后的目录结构&#xff…...

【前端,TypeScript】TypeScript速成(九):async-await 语法糖

async-await 语法糖 可以使用 async-await 来管理 Promise&#xff0c;下例重写上一节使用 Promise then 的形式计算 ( 2 3 ) ( 4 5 ) (23) \times (45) (23)(45)&#xff1a; function add(a: number, b: number): Promise<number>{return new Promise((resolve,…...

基于ADAS 与关键点特征金字塔网络融合的3D LiDAR目标检测原理与算法实现

一、概述 3D LiDAR目标检测是一种在三维空间中识别和定位感兴趣目标的技术。在自动驾驶系统和先进的空间分析中&#xff0c;目标检测方法的不断演进至关重要。3D LiDAR目标检测作为一种变革性的技术&#xff0c;在环境感知方面提供了前所未有的准确性和深度信息. 在这里&…...

STM32供电参考设计

STM32供电参考设计 ​ 在图中有VDD&#xff0c;VSS和VDDA&#xff0c;VSSA两种类型的供电引脚&#xff0c;其数据手册解释如下&#xff1a; ​ 令我不解的是&#xff1a;VDDA和VSSA必须分别连接到VDD和VSS&#xff0c;这是什么意思&#xff1f;有大佬能够解答一下吗&#xff1f…...

C/C++头文件uitility

在C中&#xff0c;<utility>头文件提供了一些通用的工具类和函数&#xff0c;这些工具类和函数在编写高效、可读性强的代码时非常有用。以下是<utility>头文件中一些常用函数和类的详细介绍及使用示例&#xff1a; std::pair&#xff1a;一个模板类&#xff0c;用于…...

Nature Electronics——近传感器计算:50 nm异构集成技术的革命

创新点&#xff1a;1.高密度互联设计&#xff1a;基于二维材料&#xff0c;开发出互连密度高达62,500 I/O每平方毫米的M3D集成结构。2.异构层堆叠&#xff1a;整合了第二层石墨烯化学传感器和第一层MoS₂记忆晶体管&#xff0c;实现功能互补。3.超短传感器与计算元件距离&#…...

腾讯云AI代码助手编程挑战赛-图片转换工具

作品简介&#xff1a; 解决了人们学习生活中的图片格式转换问题&#xff0c; 制作该脚本&#xff0c;省去了打开在线编辑器操作的时间&#xff0c; 免费为用户提供图片格式的转换的实用小工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c; 引用PIL包转换图…...

英伟达Project Digits赋能医疗大模型:创新应用与未来展望

英伟达Project Digits赋能医疗大模型&#xff1a;创新应用与未来展望 一、引言 1.1 研究背景与意义 在当今数字化时代&#xff0c;医疗行业作为关乎国计民生的关键领域&#xff0c;正面临着前所未有的挑战与机遇。一方面&#xff0c;传统医疗模式在应对海量医疗数据的处理、复…...

查找路由器的管理后台ip【通用找IP】

需求&#xff1a; 刚刚搞了个【小米】路由器&#xff0c;我想进路由的管理后台&#xff0c;提示&#xff1a;安装xx的路由管家&#xff0c;我不想安装 但是无法找到这个管理后台。 而且我是用这个路由作为中继&#xff0c;那么这个路由的ip就会经常更换 尝试通过网上搜索引擎来…...

Nginx:Stream模块

什么是 Stream 模块? Stream 模块 是 Nginx 的一个核心模块,专为处理非 HTTP 协议的流量(TCP 和 UDP 流量)而设计。它可以用来负载均衡和代理 TCP 或 UDP 连接,适用于多种应用场景,如: 数据库集群(MySQL、PostgreSQL 等)邮件服务器(SMTP、IMAP、POP3)游戏服务器VoI…...

C++语言的并发编程

C语言的并发编程 引言 随着计算机技术的飞速发展&#xff0c;尤其是多核处理器的普及&#xff0c;如何高效地利用计算机资源成为了一个重要话题。在这个背景下&#xff0c;并发编程已经成为了一种必须掌握的技能。C作为一种强大的编程语言&#xff0c;也提供了丰富的工具和库…...

Boost.Asio 同步读写及客户端 - 服务器实现详解

Boost.Asio 同步读写及客户端 - 服务器实现详解 参考文献 Boost.Asio 官方文档学习资料来源: 参考网址 一、引言 Boost.Asio作为一个强大的跨平台网络编程库&#xff0c;为开发者提供了丰富的网络操作接口。在之前的学习中&#xff0c;我们已接触到其同步读写的API函数&…...

机器人技术:ModbusTCP转CCLINKIE网关应用

在当今自动化生产与智能制造领域&#xff0c;ModbusTCP转CC-LinkIE网关KJ-MTCPZ-CCIES的应用正日益成为提升生产效率、实现设备间高效通信的重要技术手段。这一转换技术不仅打破了不同通信协议间的壁垒&#xff0c;还为机器人产品的应用提供了更为广阔的舞台。ModbusTCP作为一种…...

CSS——24.实战技能网导航栏 hove状态

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>技能网导航hover状态</title><style type"text/css">nav{width: 1000px;height: 40px;background:#363636;margin: 100px auto;}nav div{width: 100p…...

计算机视觉目标检测-DETR网络

目录 摘要abstractDETR目标检测网络详解二分图匹配和损失函数 DETR总结总结 摘要 DETR&#xff08;DEtection TRansformer&#xff09;是由Facebook AI提出的一种基于Transformer架构的端到端目标检测方法。它通过将目标检测建模为集合预测问题&#xff0c;摒弃了锚框设计和非…...

【计算机网络】课程 实验五 静态路由配置

实验五 静态路由配置 一、实验目的 理解静态路由的工作原理&#xff0c;掌握如何配置静态路由。 二、实验分析与设计 【背景描述】 假设校园网分为 2 个区域&#xff0c;每个区域内使用 1 台路由器连接 2 个子网&#xff0c; 现要在路由器上 做适当配置&#xff0c;实现校…...

FPGA车牌识别

基于FPGA的车牌识别主要包含以下几个步骤&#xff1a;图像采集、颜色空间转换、边缘检测、形态学处理&#xff08;腐蚀和膨胀&#xff09;、特征值提取、模板匹配、结果显示。先用matlab对原理进行仿真&#xff0c;后用vivado和modelsim进行设计和仿真。 一、1.图像采集采用ov…...

最好用的图文识别OCR -- PaddleOCR(2) 提高推理效率(PPOCR模型转ONNX模型进行推理)

在实际推理过程中&#xff0c;使用 PaddleOCR 模型时效率较慢&#xff0c;经测试每张图片的检测与识别平均耗时超过 5 秒&#xff0c;这在需要大规模自动化处理的场景中无法满足需求。为此&#xff0c;我尝试将 PaddleOCR 模型转换为 ONNX 格式进行推理&#xff0c;以提升效率。…...

STM32-笔记39-SPI-W25Q128

一、什么是SPI&#xff1f; SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且 在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为…...

反规范化带来的数据不一致问题的解决方案

在数据库设计中&#xff0c;规范化&#xff08;Normalization&#xff09;和反规范化&#xff08;Denormalization&#xff09;是两个相互对立但又不可或缺的概念。规范化旨在消除数据冗余&#xff0c;确保数据的一致性和准确性&#xff0c;但可能会降低查询效率。相反&#xf…...

依赖注入学习

1.介绍 依赖注入&#xff08;Dependency Injection, DI&#xff09;是一种软件设计模式&#xff0c;用于实现类与其依赖项之间的解耦。它的核心思想是&#xff0c;将类所依赖的对象通过外部注入的方式传递给它&#xff0c;而不是在类内部自行创建依赖对象。通过这种方式&#…...

ESP32-C3 AT WiFi AP 启 TCP Server 被动接收模式 + BLE 共存

TCP 被动接收模式&#xff0c;每次发的数据会先存到缓冲区&#xff0c;参见&#xff1a;ATCIPRECVTYPE 指令说明。 即每包数据不会实时报告 IPD 接收情况&#xff0c;如果需要查询缓冲区的数据&#xff0c;先用 ATCIPRECVLEN? 指令查询被动接收模式下套接字数据的长度 。获取…...

git tag

文章目录 1.简介2.格式3.选项4.示例参考文献 1.简介 同大多数 VCS 一样&#xff0c;Git 也可以对某一时间点的版本打上标签&#xff0c;用于版本的发布管理。 一个版本发布时&#xff0c;我们可以为当前版本打上类似于 v.1.0.1、v.1.0.2 这样的 Tag。一个 Tag 指向一个 Commi…...

rabbitmq的三个交换机及简单使用

提前说一下&#xff0c;创建队列&#xff0c;交换机&#xff0c;绑定交换机和队列都是在生产者。消费者只负责监听就行了&#xff0c;不用配其他的。 完成这个场景需要两个服务哦。 1直连交换机-生产者的代码。 在配置类中创建队列&#xff0c;交换机&#xff0c;绑定交换机…...

TCP 如何获取端口信息

注&#xff1a;本文为 “TCP 如何获取端口信息” 相关讨论摘录。 机翻&#xff0c;未校。 How TCP Gets Port Information TCP 如何获取端口信息 asked Nov 10, 2024 at 19:57 user15503745 API Call for Connection API 调用以建立连接 Before the app can send data d…...

HashMap和HashTable的区别

1、HashMap是线程不安全的&#xff0c;HashTable是线程安全的 HashMap&#xff1a;Fail-fast 机制。表示快速失败&#xff0c;在集合遍历过程中&#xff0c;一旦发现容器中的数据被修改了&#xff0c;会立刻抛出ConcurrentModificationException异常&#xff0c;从而导致遍历失…...

USB 传输技术 OTG(On-The-Go)极简理解

OTG 极简理解 OTG&#xff0c;全称为 On-The-Go&#xff0c;它是一种 USB 传输技术 OTG 的主要应用于不同的设备或移动设备间的联接&#xff0c;进行数据交换 OTG 允许在没有电脑作为中转站的情况下&#xff0c;实现设备间的数据传送以及不同设备间的互相连接 在手机中&…...

SpringBoot插件

SpringBoot的插件机制是其强大灵活性的重要体现&#xff0c;它允许开发人员将应用程序的不同功能模块打包为独立的插件&#xff0c;并可以动态地加载和卸载这些插件。以下是对SpringBoot插件机制的详细解析&#xff1a; 一、插件机制的概念 插件机制是一种软件开发方法&#…...

【开发环境搭建篇】Visual Studio 2022 安装和使用

本文收录于 《C编程入门》专栏&#xff0c;从零基础开始&#xff0c;介绍C编程入门相关的内容&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、下载三、安装四、使用五、总结 一、前言 本文介绍如何在Windows环境下安装Visual Studio 2022。 什么是Vi…...

深度学习:Java DL4J基于RNN构建智能停车管理模型

### 深度学习&#xff1a;Java DL4J基于RNN构建智能停车管理模型 #### 引言 随着城市化进程的加速&#xff0c;停车问题日益成为城市管理的难点和痛点。传统的停车场管理方式效率低下&#xff0c;导致停车场资源无法得到充分利用&#xff0c;车主停车体验差。为了解决这些痛点…...

创建型模式-工厂模式

工厂模式是一种创建型的设计模式&#xff0c;原理是父类提供一个创建对象的方法&#xff0c;允许子类去实现具体的实例化对象。通过此模式可减少创建和具体的产品之间的耦合关系。 适用场景&#xff1a; 1、当需求中无法预估对象确切类别及个别的依赖关系。例如&#xff1a; …...

UI自动化测试框架playwright--初级入门

一、背景&#xff1a;UI自动化的痛点&#xff1a; 1、设计脚本耗时&#xff1a; 需要思考要如何模拟用户的操作&#xff0c;如何触发页面的事件&#xff0c;还要思考如何设计脚本&#xff0c;定位和操作要交互的元素、路径、位置&#xff0c;再编写代码逻辑&#xff0c;往复循…...

算法 -归并排序

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【算法】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f500; 归并排序&#x1f4d6; 简介&#x1f5bc;️ 示意图&#x1f4a1; 实现思路&#x1f4bb; 代码实现&#x1f4a1; 实现思路2 - 非递归&#x1f4bb…...

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI&#xff0c;点击按钮后&#xff0c;会变成为一个监听按钮。旁边会有音符飞入这个监听按钮&#xff0c;最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码...

NRC优先级中比较特殊的—NRC0x13和NRC0x31

1、基础知识 大家都了解 NRC0x13&#xff0c;表示长度错误和格式错误 NRC0x31&#xff0c;表示DID不支持和数据格式不支持 2、为什么说这两个NRC比较特殊 看下图的标注部分&#xff1a; 2.1、先看NRC0x13 步骤一&#xff1a;仔细看是先判断Minmun Length Check &#xff0…...

文件的介绍4

一、文件的随机读写 1.fseek I 从左往右 第一个参数 stream 是一个 指向已经被打开的文件流 的指针 第三个参数 origin 是个常量&#xff0c;指定从哪个位置开始偏移&#xff0c;它的取值&#xff1a; SEEK_SET&#xff1a;从文件开头开始偏移。SEEK_CUR&#xff1a;从当前…...

Mysql - 多表连接和连接类型

在关系型数据库中&#xff0c;多表连接&#xff08;JOIN&#xff09;是用于从多个表中检索数据的常用操作。通过连接多个表&#xff0c;可以将分散在不同表中的相关数据组合在一起&#xff0c;从而进行更复杂的查询和分析。在这篇文章中&#xff0c;我们将深入探讨MySQL中的多表…...

Tableau数据可视化与仪表盘搭建-可视化原则及BI仪表盘搭建

目录 可视化原则 BI仪表盘搭建 仪表盘搭建原则 明确仪表盘主题 仪表盘主题拆解 开发设计工作表 经营情况总览&#xff1a;突出显示的文字 经营数据详情&#xff1a;表格 每日营收数据&#xff1a;多轴折线图 每日流量数据&#xff1a;双轴组合图 新老客占比&#xf…...

如何制作一份出色的公司介绍PPT?

制作一份公司介绍的PPT需要精心设计&#xff0c;以确保内容既专业又吸引人。以下是一个基本的框架和一些建议&#xff0c;帮助您创建一份有效的公司介绍PPT&#xff1a; PPT标题页 标题&#xff1a;公司全称&#xff08;可使用公司Logo作为背景或嵌入标题中&#xff09;副标题…...

【Arm】Arm 处理器的半主机(semihosting)机制

概览 通过 semihosting 机制&#xff0c;主机可以通过调试器使用目标计算机 IO 接口。 例如开发者的 PC 通过 J-Link 来使用 STM32 MCU 的输入输出。 这些功能的示例包括键盘输入、屏幕输出和硬盘 I/O。例如&#xff0c;可以使用此机制启用 C Library 中的函数&#xff0c;如…...

C语言基本知识复习浓缩版:输出函数printf

输出函数printf学习 printf()的作用是将文本输出到屏幕上使用之前需要先引入stdio.h头文件printf函数在使用的时候&#xff0c;至少需要一个参数 printf() 是 C 语言标准库中的一个函数&#xff0c;用于将格式化的文本输出到标准输出设备&#xff08;通常是屏幕&#xff09;。…...

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…...

WebRTC:构建实时通信应用的利器

都已无处不在。而 WebRTC&#xff08;Web Real-Time Communication&#xff09;则为开发者提供了一种简便的方式&#xff0c;来在浏览器中实现实时的音视频通信和数据传输。本文将介绍 WebRTC 的基本概念、工作原理&#xff0c;以及如何利用 WebRTC 构建实时通信应用。 什么是…...

个人博客搭建(二)—Typora+PicGo+OSS

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; 做个超努力的小奚-CSDN博客 一、前言 博客搭建完一直没有更新&#xff0c;因为WordPress自带的文档编辑器不方便&#xff0c;以前用CSDN写作的时候&#xff0c;习惯了Typora。最近对比了…...

华纳云:在centos7中tomcat内存怎么设置?

在 CentOS 7 中&#xff0c;可以通过修改 Tomcat 的启动脚本来调整 Tomcat 的内存设置。Tomcat 的内存配置主要涉及 JVM 参数(Java Virtual Machine)&#xff0c;可以通过设置 -Xms(初始内存)和 -Xmx(最大内存)来调整内存大小。 步骤如下&#xff1a; 1. 修改 Tomcat 启动脚本 …...

樱桃键盘win键按了没反应怎么处理

‌游戏模式‌&#xff1a;部分樱桃键盘在进入游戏模式后会禁用Win键&#xff0c;以防止在游戏过程中误触。可以通过按下Fn F9键来切换游戏模式和办公模式&#xff0c;确保键盘处于办公模式下&#xff0c;Win键即可恢复正常功能。‌ &#xff08;至此我的问题已解决&#xff0c…...

【UE5 C++课程系列笔记】23——多线程基础——AsyncTask

目录 概念 函数说明 注意事项 &#xff08;1&#xff09;线程安全问题 &#xff08;2&#xff09;依赖特定线程执行的任务限制 &#xff08;3&#xff09;任务执行顺序和时间不确定性 使用示例 概念 AsyncTask 允许开发者将一个函数或者一段代码逻辑提交到特定的线程去执…...

Docker运维高级容器技术知识点总结

1、虚拟机部署和容器化部署的区别是什么&#xff1f; 1、技术基础&#xff1a; <1>.虚拟化技术在物理硬件上创建虚拟机&#xff0c;每台虚拟机运行自己完整的操作系统、从而实现资源隔离。 <2>.容器化技术&#xff1a;将应用程序打包在容器内&#xff0c;在进程空间…...

Docker的安装和使用

容器技术 容器与虚拟机的区别 虚拟机 (VM) VM包含完整的操作系统&#xff0c;并在虚拟化层之上运行多个操作系统实例。 VM需要更多的系统资源&#xff08;CPU、内存、存储&#xff09;来管理这些操作系统实例。 容器 (Container) 容器共享主机操作系统的内核&#xff0c;具…...