clojure实战——配置文件

config:使用EDN配置文件在Clojure中管理环境变量的库 立即下载
使用clojure开发时,被它灵活、简单的配置形式给惊艳到了!当然,我这里不是说各种复杂的组件之间的配置,而是一些
简单的、用于程序内部逻辑的一些配置。因为自己在使用clojure时,用各种组件构建复杂的服务的经验尚少,就不敢妄语。
这里主要针对自己在项目开发工程中用到的部分做讲解。

clojure配置的方式大致有两种(当然,github也有一些开源包定义自己配置方式):.edn文件和.clj文件。


1. .edn形式配置

1.1 .edn文件格式

.edn文件其实就是一个静态文本文件配置。要使用这种配置形式,你只理解Map这一种数据结构!也就是说,.edn文件中必

须是一堆key-value的map格式,可嵌套。

下面以一个具体的配置文件举例说明,如下config.edn:

{; .edn文件支持注释,因而可以就地添加配置说明,方便维护。
 ; .edn文件主要是map的key-value格式,其中value可以有复杂的数据类型
 ; (1)value为简单类型String、int、float等
 :name "b" :age 20 :length 1.76
 ; (2)value为map类型
 :rpc-server {:host "127.0.0.1" :port 8015 :log-level :debug}
 ; (3)value为set类型,注意:set要遵循java集合类型Set的规则,不能重复,类型一致
 :set-config1 #{1 2 3}
 :set-config2 #{:a :b :c}
 ; (4)value为数组类型,用"[]"表示
 :arr-config [1 2 3 4]
 ; (5)各类型间可相互组合,嵌套,如:
 :students [{:name1 "a" :age 20}
            {:name1 "b" :age 20}
            {:name1 "c" :age 20}]}

clojure在读入.edn文件时,会判断其value的类型,进而将其转换为对应的数据类型。

:name "b"中"b"在内存中会是String类型,"[]"为数组,"#{}"为set集合,所以你可以用clojure处理这些类型的方法取处理这些

数据。完全是无缝连接,非常方便。但要注意一点:clojure读入.edn文件时,不会对配置的算术表达式进行运算。如你不能

配置":age (+ 1 2)",而期待clojure会帮你处理为":age 3"

1.2 读入.edn文件

要读入文件,首先要用到clojure.java.io单元,该单元用于读入文件到内存。其次使用clojure.edn单元,该单元会将.edn文件

中的各种value转换为对应类型的值。最后,你就可以在程序中像是使用clojure的map类型数据一样使用你得配置啦!


读取.edn配置代码如下:

(ns util.readedn
  (:require [clojure.java.io :as cio]
            [clojure.edn :as edn]))


(defn load-edn-config
  "加载edn配置文件"
  [edn-filename]
  (with-open [in-edn (-> edn-filename
                         cio/resource
                         cio/reader
                         (java.io.PushbackReader.))]
    (clojure.edn/read in-edn)))

使用举例:

(ns example
  (:require [util.readedn :as util])
  
(defn read-edn-eg []
  (let [conf (util/load-edn-config "etc/config.edn")]
    (:name conf)))

该函数应该返回name的值“b”(代码简单,未测试)。


2. .clj配置形式

2.1 .clj配置格式

.clj文件其实和clojure工程中其他.clj一样,其书写格式必须满足clojure编程的语法,只是.clj放入到资源文件夹时,就被当成资源文件进行修改、配置。

.clj文件与其他clojure工程文件一样,可以在里面定义函数、运算、函数调用等等。但建议不要过于复杂,不然就失去配置文件的本来意义。

如config.clj:

(ns config)
(def config1 
      {:a "a" :b "b"})
(def config2 
      {:a (+ 1 2)
       :b (fn [arg1] (prn (str arg1))
       :c (fn [arg2] <pre name="code" class="java">


可以看出,它和普通的.clj文件一样有命名空间,遵从clojure语法。

2.2 使用.clj配置文件

.clj配置文件使用时非常简单,就像引用普通.clj文件一样,(:require [config])。

如:

(ns test
  (:require [config]))

(defn get-config []
   (-> config/config2
         :a))


               (let [a 3]
                  (+ a 4))})

函数get-config应该返回3,即“:a (+ 1 2)”对应的配置值。

被当成资源文件的.clj文件在修改之后不用再编译整个功能,只需重新启动服务,就能将修改加载到程序中。


3. 总结

使用那种配置格式,根据项目需要选择。

通常来说,如果只是静态值的配置,建议使用.edn文件形式,因为.clj形式的配置文件在使用时,是作为一个普通的.clj文件导入的,耦合太紧。

而如果想要配置简单逻辑、动态输出等,用.clj的方式会非常方便(这是用java等语言所没有的便捷)。

如果你的程序设计得足够好,完全可以通过配置来修改程序的部分逻辑,从而使同一个框架代码产出不同的效果!


用clojure已一年,一直也没有很深入去研究这么语言,只是在工作中要用到的时候,再去查阅资料,现学现卖,也能把项目完成~(不知不觉也学会很多)。其实一直纠结于学clojure是否有用,因为目前国内使用clojure开发的公司还是很少,对于以后的职业发展是否有利,有点困惑。不过最近在一些论坛看到有很多人也在学习clojure(貌似很多都没有自己学的好\(^o^)/~),有些公司也在使用clojure,招聘网上也有零星clojure工程师招聘...就觉得clojure也是一门可以用于吃饭的语言^ ^。再者,在实际应用中,发现clojure做服务器端有时开发效率当真很快,代码也优雅...学学也是蛮有价值的。另外,发现clojure的中文资料还是很少,特别是对其实际应用的中文资料,因此决定好好总结一下clojure在一些实际项目中的应用,贡献微薄经验,希望于他人有所帮助。


edn:可扩展的数据符号 埃登 可扩展数据符号[eed-n] 基本原理 edn是可扩展的数据符号。 edn的超集由Clojure用于表示程序,Datomic和其他应用程序将其用作数据传输格式。 本规范将edn与那些和其他特定用例隔离开来描述,以帮助促进使用其他语言和其他用途的读者和作家的实现。 edn支持丰富的内置元素集,以及其他扩展元素的定义。 没有此类功能的数据格式用户必须依靠约定或上下文来传达基本集中未包含的元素。 这明显地简化了格式,从而使应用程序逻辑大大复杂化。 edn非常简单,但功能强大,足以满足应用程序的需求,而无需使用约定或复杂的上下文相关逻辑。 edn是一个传递价值的系统。 它不是类型系统,也没有模式。 它也不是一个表示对象的系统-没有引用类型,用户也不应期望edn某些主体中的两个等效元素在读取时会产生不同的对象标识,除非读者的实现不脱离其实现方式。这样的承诺。 因此,应将结果值视为不可变的, 立即下载

相关推荐

config:使用EDN文件和clojure.spec配置系统

config:使用EDN文件和clojure.spec配置系统

vivado的edif文件生成

edif vivado

wang__shenli的博客 1731

tools.analyzer, 用于Clojure代码的分析器,用Clojure编写,并在EDN中生成 AST.zip

tools.analyzer, 用于Clojure代码的分析器,用Clojure编写,并在EDN中生成 AST tools.analyzer主机无关Clojure代码的分析器,用Clojure编写,并在EDN中生成 AST 。我在 2015年12月的ClojureX上讨论了 tools.analyzer [.jvm] 。 这里是视频 。Tim

No.4 clojure加载.clj文件

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34087307的博客 269

Delphi开发者必备:CEF4Delphi跨平台浏览器嵌入实战指南(含Lazarus适配)

本文详细介绍了Delphi开发者如何利用CEF4Delphi实现跨平台浏览器嵌入,包括环境配置、Lazarus适配、ARM架构优化及Firemonkey集成等实战技巧。通过Chromium引擎的强大功能,开发者可以轻松为传统桌面应用添加现代浏览器特性,提升多平台开发效率。

weixin_29233333的博客 226

实战指南:彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例

本文详细介绍了如何彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例,解决重新安装时的冲突问题。通过控制面板排查、注册表验证、安全卸载操作流程和注册表深度清理等步骤,确保完全移除残留组件,避免系统崩溃。文章还提供了安装环境重建策略和预防措施,帮助工程师高效管理西门子自动化软件。

weixin_30482181的博客 404

Vivado完成综合后从总网表中导出指定子模块网表

工程导入.edn网表后,点击切换到“Compile Order”窗口,将对应带.edn网表从“Utility Sources”手动拖进“Design Sources”栏里,否则综合时依旧会识别不到网表。提供给客户的总网表内存在子模块黑盒(例如Xilinx官方的RAM等IP核),自己这边再综合一次完整版的网表非常耗时,只能从现有总网表中提取黑盒模块网表提供给客户进行填充。注意:如果总网表提供方的vivado版本跟自己的不一样,一些IP的网表文件名可能不一样。注意:子模块路径是例化名路径,而不是模块名路径。

Arick_cook的博客 1029

学术版GPT安装教程——保姆版(附带原生GPT注册教程)

学术版GPT图文安装教程

DBenD的博客 2万+

colojure语言基础入门

作者:xumingming| 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://xumingming.sinaapp.com/302/clojure-functional-programming-for-the-jvm-clojure-tutorial/ 本文翻译自: Clojure – Functional Programming fo

scl1991的专栏 2416

CANoe/CANalyzer新手必看:从零配置到报文分析的完整流程(附B站官方教程实操)

本文为CANoe/CANalyzer新手提供从零配置到报文分析的完整流程指南,涵盖硬件连接、工程配置、报文捕获及信号级分析等关键步骤。通过详细的实操案例和B站官方教程,帮助工程师快速掌握汽车电子总线分析工具的核心应用,提升诊断效率与通信系统理解。

y7z8a的博客 771

OpenWrt南京电信PPPoE IPv6配置:从零搭建稳定双栈网络

本文详细指导如何在南京电信PPPoE宽带环境下,为OpenWrt路由器配置稳定的IPv6双栈网络。核心在于正确设置WAN6接口为DHCPv6客户端,并请求/60前缀,同时配置LAN口分发地址并放行防火墙关键流量,确保内网设备获得原生IPv6连接。

water的专栏 1339

用Clojure MCP创建专属AI智能体:Agent配置系统实战教程

Clojure MCP 是一个将 LLM 客户端与 Clojure 项目深度连接的 MCP 服务器,而它的 Agent 配置系统让你**无需编写任何代码**就能创建专属 AI 智能体。本文是一份面向新手的 Agent 配置系统实战教程:从零开始,教你通过一个简单的配置文件,定义多个拥有不同性格、不同工具权限和不同记忆能力的 AI 智能体,打造属于你自己的"AI 开发团队"。 ## 什么是 Clo

gitblog_01008的博客 296

静态时序分析—门控时钟检查(clock gating check)

clock gating check的条件与类型

m0_61544122的博客 9603

clojure实战——基于logstash搭建日志数据获取与整理平台(2)

clojure实战——基于logstash搭建日志数据获取与整理平台(2)1. logstash简介logstash是金牌搭档ELK中的“L”,它主要负责数据的收集、解析整理、传输。这对应体现在它的配置文件中的input、filter、output这三段配置。下面仅针对本次项目中需要使用到的地方做一个讲解,其他方面读者可自行到其官网查阅。2. logstash使用(1)运行一个logstash使用l

蜗牛的专栏 884

让 ABAP 开发更聪明的搭档:SAP Joule for Developers 与 ABAP AI Capabilities 全面实战

摘要:SAP已将生成式AI集成到ABAP开发工具中,推出Joule for Developers功能。该功能直接嵌入Eclipse开发环境,提供代码解释、生成、测试构造和遗留代码迁移等辅助功能。Joule支持ABAP Cloud项目开发,能围绕当前开发对象提供上下文相关的建议,帮助开发者高效完成应用开发与迁移任务。启用该功能需升级ADT并获取相应许可,典型应用场景包括RAP应用构建和S/4HANA迁移中的代码重构。官方资源提供了多个实践案例,帮助开发者快速上手这一AI辅助开发功能。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 489

go实现MQTT broker(附完整源码)

go实现MQTT broker(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 572

终极Instaparse组合子编程指南:从字符串文法到程序化构建的实用技巧

Instaparse是一个功能强大的解析器生成工具,它能将标准EBNF或ABNF符号的上下文无关文法转换为可执行解析器,轻松处理左递归、右递归和歧义文法。本文将为你揭示如何利用Instaparse的组合子功能,从简单的字符串文法过渡到灵活的程序化构建,掌握高级解析技巧。 ## 为什么选择Instaparse组合子? Instaparse的核心优势在于它能处理任何上下文无关文法,无需受限于特定解

gitblog_00564的博客 339

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

如何用Clojure MCP将Claude Desktop变成你的Clojure专属AI编程助手

Clojure MCP 是一个连接 AI 客户端与 Clojure 项目的 MCP 服务器,它能将 Claude Desktop 变成真正懂括号、懂 REPL 的 Clojure 专属 AI 编程助手。本教程将手把手教你完成安装、配置与验证,无需深厚的 Clojure 功底,跟着步骤走即可在十分钟内搭建完成,让 AI 帮你写 Clojure 代码、跑测试、重构命名空间。 ## 什么是Clojur

gitblog_00872的博客 726

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

探索Edamame:一个强大的Clojure和EDN解析器

探索Edamame:一个强大的Clojure和EDN解析器 项目简介 在编程世界里,解析是数据处理的核心环节。对于Clojure和EDN(Extensible Data Notation)语言的使用者而言,Edamame是一个不可或缺的工具。它是一个高度可配置的解析库,提供位置元数据,让开发者可以更精确地理解和操作Clojure和EDN文件。 项目技术分析 Edamame的独特之处在于其灵活的选项...

gitblog_00017的博客 458

关于js.map以及css.map

什么是source map文件。 source map文件是js文件压缩后,文件的变量名替换对应、变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下。 比如压缩后原变量是map,压缩后通过变量替换规则可能会被替换成a,这时source map文件会记录下这个mapping的信息,这样的好处就是说,在调试的时候,如果有一些JS报错,那么浏览器会通过解...

weixin_30361641的博客 963

用Clojure编写REST service 四 读取配置文件

最好的配置文件写法是采用clj文件,下面先把前面的a.xml文件改成a.clj文件,内容如下:{:mongodb "localhost" :listen_port 7777 :login_timeout 200 :check_timeout 200}这里定义了一个map。注意,localhost是字符串,必须用双引号。这里用空格分开每个key/value组成的pair.在test.clj文件中添加

Dean Chen的专栏 3635

Path of Building PoE2:从数据迷雾到精准构建的蜕变之旅

你是否曾在流放之路2中花费数小时调整装备和天赋,却依然无法确定哪个构建方案真正最优?当数字与直觉冲突时,是相信屏幕上的DPS显示,还是跟随社区大神的模糊建议?Path of Building PoE2(PoB2)正是为解决这一核心矛盾而生——它将角色构建从玄学猜测转变为精确的科学计算。 ## 构建者的新罗盘:告别盲目试错 在流放之路2的复杂生态系统中,每个角色构建都像是一场多维度的拼图游戏。技

gitblog_00866的博客 390

Integrant配置魔法:如何使用EDN文件构建复杂系统

Integrant是一个基于数据驱动架构的微框架,它通过EDN(Extensible Data Notation)配置文件帮助开发者以声明式方式构建和管理复杂系统。本文将揭示Integrant的配置魔法,带你轻松掌握使用EDN文件构建灵活、可维护系统的核心技巧。 ## 🧩 EDN配置:数据驱动架构的基石 EDN作为Clojure生态系统的标准数据格式,为Integrant提供了强大的配置能力

gitblog_01018的博客 420

探索edn-java:高效解析与打印EDN格式的Java库

探索edn-java:高效解析与打印EDN格式的Java库 项目介绍 edn-java 是一个用于解析(读取)和打印(写入)EDN格式的Java库。EDN(Extensible Data Notation)是一种数据序列化格式,广泛用于Clojure等编程语言中。edn-java 提供了强大的功能,使得Java开发者能够轻松地在Java环境中处理EDN数据。 项目技术分析 安装与依赖 edn-ja...

gitblog_00377的博客 1030

Clojure的便捷工具:deps.clj安装与使用指南

Clojure的便捷工具:deps.clj安装与使用指南 1. 项目介绍 deps.clj 是一个对 Clojure 官方命令行工具(CLI)bash脚本的忠诚移植,它使用Clojure语言重写。此项目旨在提供一个稳定且灵活的替代方案,特别是对于那些希望在不依赖于bash环境的系统上使用Clojure的开发者。从版本1.13.0起,它采用了deps.cljs进行依赖管理,确保了与Clojure C...

gitblog_00421的博客 651

Clojure教程-基本语法

目录 1 简介 2 核心语法 3 代码功能 3.1 读取简繁字典 3.2 进行简繁翻译 3.3 读取不需要翻译的文字 3.4 过滤不翻译的文字 3.5 提供给Java调用 3.6 打包 4 源码 简介 学习一门语言最好的方法就是去使用它。我们就从一个小例子来学习 Clojure语法. 核心语法 首先先来看

PEAK 6567
上一篇: java多线程编程--如何终止一个线程
下一篇: clojure实战——midje测试框架
蜗牛lz
博客等级 码龄15年 17粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值