clojure实战——函数内存化

Clojure语言的语法 Clojure是一种基于Lisp方言的现代编程语言,它运行在Java虚拟机(JVM)上。这一语言由Rich Hickey于2007年首次发布,旨在解决现代软件开发面临的挑战,尤其是在并发和持久性方面。Clojure的设计哲学强调简单、表达性和函数式编程的思想,使得代码可以更简洁、更易于维护。在Clojure中,定义函数使用defn关键字。clojure(+ a b))这一语句定义了一个名为add的函数,接受两个参数a和b,并返回它们的和。 阅读详情

纯函数

就从纯函数开始讲起吧。
对于纯函数,它具以下几个特征:

  • 没有副作用:不会读写数据库、文件、socket、以及全局变量等。
  • 具有一致性:正是因为没有副作用,纯函数才能表现出一致性:即对于参数a, b它始终会返回结果c,不管在什么环境中。
  • 易于测试:纯函数的返回值完全由它的参数决定,因此编写测试用例时,不需要mock,你可以轻松地对一个纯函数进行全面测试。
  • 结果可缓存:任何使用到纯函数表达式的地方,都可以用它的返回值来代替,不会改变代码的行为。如(+ 1 2)(- 10 7)等,这些都可以用3来代替。
  • 易于并行化:因为没有副作用,不会对线程间共享数据产生竞争,是线程安全的。

因为对于特定的输入,纯函数的输出是一定的,所以我们再有些应用场景中可以将函数的返回值缓存下来,下次再调用的时候,就可以直接返回缓存的返回值,而不需要再次计算。这一技术也称作:内存化。

clojure实现内存化

clojure是利用memoize函数实现内存化的,如:

;定义一个判断是否为素数的函数
(defn prime?
  [n]
  (cond (= 1 n) false
        (= 2 n) true
        (even? n) false
        :else (->> (range 3 (inc (Math/sqrt n)) 2)
                   (filter #(zero? (rem n %)))
                   empty?)))
;未内存化之前,测试其性能
(time (prime? 112567875444488899908778877722222229999999))
"Elapsed time: 1.530635 msecs"
=> false

; 进行内存化,并测试其性能
(let [m-prime? (memoize prime?)]
  (time (m-prime? 112567875444488899908778877722222229999999))
  (time (m-prime? 112567875444488899908778877722222229999999)))
"Elapsed time: 1.538332 msecs"
"Elapsed time: 0.056948 msecs"
=> false

可以看出,对于一些耗时很长的运算,利用内存化可以大大提高效率。

上述所说是建立在纯函数的基础之上,但并不是说只有纯函数的情况下才能使用这一技术。比如说,我们有时需要读取一个在程序运行过程中不会被改变的文件(如配置文件),我们可以在第一次读取的时候,将所有配置信息通过内存化技术缓存起来,以后读取时就可以不用再加载文件。另外,在实际项目中,我们也经常会提到一些所谓的“经验值”,实际上和这个是相似的思想,通过很多次的实际应用,得出某些运算产生的值与经验值相近(满足实际要求),则可以用该经验值代替此运算,以提升效率。

memoize实现内存化的原理

memoize会保存所有调用参数和对应返回值的映射,不会被JVM垃圾回收。因此,如果要被内存化的函数的参数或返回值非常占内存,那么需要谨慎考虑,不然会造成“内存泄露”,可将其放在顶层函数的内部,而不是定义为一个全局变量。

Clojure语言的数据类型 Clojure通过丰富的数据类型和集合机制,使得开发者能够以直观而高效的方式处理数据。无论是基本的数值、字符串,还是复杂的集合、映射,Clojure都为开发者提供了丰富的操作函数,结合不可变性设计,可以使程序更加健壮与易于维护。在实际开发中,合理利用这些数据类型和集合结构,能够使得Clojure程序更加简洁、清晰且具有良好的性能。希望本文对您理解Clojure的基本数据类型有所帮助,激发您在Clojure编程中探索更深层次的乐趣。 阅读详情

相关推荐

Clojure语言的计算机基础

Clojure由Rich Hickey于2007年首次发布。它是一种为JVM(Java虚拟机)设计的动态语言,同时支持JavaScript和CLR(通用语言运行时)。Clojure的设计哲学强调简单性和表达能力,旨在使编程变得更加高效。Clojure语言通过其独特的设计与实现,使得程序员能够以清晰、简洁的方式解决复杂的问题。学习Clojure不仅是一种编程语言的学习,更是对计算机科学基础知识的深入理解。

2501_90195205的博客 498

【clojure】入门篇-01

;定义一个symbol的a设置的值为hello,a值不可变;;定义局部的,直接返回了aa)ps:定义之后若要使用该函数名称,需要先执行一遍该定义的内容;;3.定义一个函数;;函数、后面跟的是一个参数列表,;;一个函数出现在列表的第一个元素位置的时候会被求值,这样就执行了这个元素;;给函数起一个名字;;通常使用 defn 函数名 参数列表 函数体。

前端代码小白的日常博客 1692

C#计算八字

private string[] jq = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };private string[] dz = { "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子" };

m0_72939038的博客 827

Clojure极简教程

Clojure是Lisp在JVM中运行的一种方言,所以可以预想其语言风格应该是括号之间的环环相扣。

微小冷的学习笔记 5410

携程景点评论数据爬取实战:破解AJAX动态加载与分页参数逆向分析

本文详细介绍了携程景点评论数据爬取的实战经验,重点破解了AJAX动态加载与分页参数逆向分析的技术难题。通过分析`getCommentCollapseList`接口,解析动态参数如`poiId`和`pageIndex`,并实现分页逻辑,帮助开发者高效获取评论数据。文章还提供了完整的Python爬虫代码和反爬策略,适用于数据分析与内容挖掘。

weixin_29098367的博客 673

科研智能体平台搭建与实战:大模型如何驱动科研自动化

大模型技术的快速发展,正推动AI智能体从单纯对话工具向主动执行任务的科研伙伴演进。智能体的核心原理在于整合模型调用、工具使用、知识库检索与工作流编排,使其能够自主拆解目标、执行操作并迭代优化。在科研场景中,这一技术价值尤为突出:文献初筛、实验数据清洗、代码调试、结果汇总等高频重复劳动均可实现自动化,大幅释放研究者精力。从基础组件配置到多智能体协同,从平台选型到提示词调优,实际落地需要关注模型匹配、工具稳定性、记忆管理与人机校验机制。本文基于真实工程经验,系统梳理科研智能体平台的搭建路径、应用案例与高频问题排

weixin_32597009的博客 282

6 年专业Clojure经验分享 - Erez

Clojure 是一种很棒的编程语言,因为它具有函数性、缺乏对象/对原始值的关注以及通过其无缝 Java 互操作提供的庞大 JVM 生态系统 与其他编程语言相比,Clojure 工程师的招聘和构建工程团队具有挑战性,因为它不受欢迎,并且缺乏大量经验丰富的工程师 在主要与 Ruby 合作多年后,我来到了Nanit。那时我并不真正了解 Clojure,所以在我的第一阶段,我主要做 Ruby 工作以提供快速价值。从那以后 6 年多过去了,今天 Clojure 是我工具...

极道Jdon的技术博客 714

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 742

Clojure是啥?

Clojure由Rich Hickey于2007年设计,旨在提供一种实用的函数式语言,同时保持Lisp的表达力。Clojure是一种运行在Java虚拟机(JVM)上的现代Lisp方言,结合了函数式编程的强大功能和Java生态系统的无缝集成能力。• 内置软件事务内存(STM)、原子引用(atom)等工具,简化多线程编程。• 函数式编程:强调不可变数据结构、纯函数和高阶函数,减少副作用。• Lisp风格:语法简洁,使用括号表示代码块,支持宏和元编程。• 编译为JVM字节码,可直接调用Java类库。

m0_61629312的博客 654

告别抖动与滞后:深入博能传动伺服DSC功能,用105报文提升多轴同步性能

本文深入解析博能传动伺服DSC功能如何通过105报文实现多轴同步性能提升,有效解决工业自动化中的抖动与滞后问题。详细介绍了DSC技术原理、105报文实现机制及多轴同步工程实践,帮助工程师优化伺服系统性能,实现绝对齿轮同步。

weixin_30394981的博客 184

手把手教你设计T型和Π型衰减器:从分贝计算到电阻选型全攻略

本文提供了一份T型和Π型衰减器的详细设计指南,涵盖从分贝计算到电阻选型的全过程。文章以50欧姆系统为例,通过公式推导和实例演示,手把手教你计算两种经典拓扑的电阻值,并深入探讨了电阻选型、误差控制及高频应用等关键实践技巧,帮助工程师和爱好者精准实现信号衰减与阻抗匹配。

blue42的博客 1332

开源项目推荐:Clojure的高效记忆库 —— clojure.core.memoize

开源项目推荐:Clojure的高效记忆库 —— clojure.core.memoize 项目介绍 clojure.core.memoize 是一个强大的 Clojure 辅助库,专门针对函数结果的缓存优化而设计。它基于Clojure的核心库之上,通过引入可插拔的内存化协议,提供了一系列灵活且高效的缓存策略实现。这些功能使得开发者能够轻松地对计算密集型或慢速响应的操作进行优化,从而提升应用性能。 ...

gitblog_01118的博客 908

AI测试干货:让大语言模型稳定输出 JSON 的四种实现方案

用大语言模型做测试用例生成、数据提取时,最头疼的就是让它老老实实返回 JSON。你以为它会给你 `{"name":"张三"}`,结果它来一句"好的,这是生成结果:```json...",或者干脆在 JSON 里加注释,直接把你的 `json.loads()` 干崩溃。 模型本质上是个话痨,天生爱解释。但我们要的是结构化数据,不是聊天记录。我整理了四种实战方案,从最简单的提示词技巧到工程化框架,覆盖了从快速验证到生产环境的各种场景。

blues_C的博客 955

Java Next: Groovy、Scala or Clojure?

Java 下一代: 选择您的下一个 JVM 语言 如果任意Java 下一代语言都适合作为您使用的下一代语言,那么您会如何选择?本文调查了会对这个重要决定产生影响的各个因素。 Java 下一代: 克服同义词干扰 上一期Java 下一代文章(“函数式编码风格”)对比和比较了 Scala、Groovy 和 Clojure 中的函数式编码风格。在本文中,系列作家 Neal...

weixin_34161064的博客 172

B07:AI 时代怎么考核团队?我把 KPI 改了 5 版才找到答案

最后说一句掏心窝的话。绩效考核不是"管人"的工具,是"引导团队行为"的工具。你定什么指标,团队就会做什么行为。你定"AI 占比",团队就凑占比你定"效率提升",团队就挑软柿子你定"代码行数",团队就刷行数你定"工具使用率",团队就刷使用只有定"业务价值 + 工程质量 + 能力成长"三个维度的指标,团队才会真正关注长期价值。这套 KPI,我在我带的团队里跑了 6 个月,没有任何一个指标被"刷"出来。考核的是结果,不是过程。永远考核"创造了多少价值",永远不考核"用了多少 AI"。

刘一说的IT专栏 499

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

详述三种现代JVM语言--Groovy,Scala和Clojure

Java的遗产将是平台,而不是程序设计语言。 Java技术的原始工程师们作出了一个明智的决定,就是将编程语言与运行时环境分开,最终这使得超过200种语言能够运行在Java平台上。这种架构对于该平台的长期活力是至关重要的,因为计算机程序设计语言的寿命一般都是比较短。从2008年开始,由Oracle主办的一年一度的JVM语言峰会为JVM上其它的语言实现与J...

weixin_33979745的博客 417

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[转载] 详述三种现代JVM语言--Groovy,Scala和Clojure

转载自http://www.tuicool.com/articles/jYzuAv和http://www.importnew.com/1537.html 在我与Martin Fowler曾经合作呈现的一次主题演讲中,他作出了一个有洞察性的观点: Java的遗产将是平台,而不是程序设计语言。 Java技术的原始工程师们作出了一个明智的决定,就是将编程语言与运行时环境分开,最终这使得超过200种...

weixin_30755709的博客 253

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

clojure语言_Clojure编程语言

本文介绍了Clojure编程语言。 Clojure是Lisp的方言。 假定您还不了解Lisp。 而是假定您具有Java技术知识。 要编写Clojure程序,您需要Java Development Kit V5或更高版本以及Clojure库。 对于本文,使用了JDK V1.6.0_13和Clojure V1。 您还应该利用Eclipse的Clojure插件(clojure-dev),并且将需要E...

cuxiong8996的博客 3576

Clojure学习笔记(一)——介绍、安装和语法

Clojure学习笔记(一)——介绍、安装和语法   什么是Clojure Clojure是一种动态的、强类型的、寄居在JVM上的语言。 Clojure的特性: 函数式编程基础,包括一套性能可以和典型可变数据结构媲美的持久性数据结构 由JVM提供的成熟的、高效的运行时环境:所以Clojure可以使用Java类库,反之Clojure库也...

大壮的博客 667

Clojure学习笔记

defn是Clojure中用于定义函数的宏。其基本语法如下:name:函数名,是一个符号。params:参数列表,是一个向量,可以包含任意数量的参数。body:函数体,是构成函数逻辑的表达式序列。通过defn宏,你可以在Clojure中定义带有参数和函数体的命名函数。函数可以作为一等公民被传递和返回,使得Clojure的函数式编程非常灵活和强大。通过编写和使用纯函数,你可以构建出清晰、可预测和可维护的代码。以messenger函数为例:"));0参数形式1参数形式这个messenger无参形态。

weixin_41635805的博客 1972

clojure实战——搭建web前端开发框架(模拟web服务器、推送js修改)

直接动手搭建框架吧,闲话留着后面碎碎念~~1. 框架概述 使用figwheel库,通过websocket将js推送给浏览器。修改ClojureScript之后,不用重新编译打包,就可立即推送到浏览器进行显示。 使用ClojureScript REPL模拟web服务器,不需将网页部署到ngnix等容器中,浏览器即可访问本地web服务。 使用environ库进行环境变量设置,可轻松切换开发/发布环境。

蜗牛的专栏 2568

Clojure语言的文件操作

通过以上的示例和讨论,我们了解到Clojure中的文件操作是如何工作的。我们从读取文件、写入文件到创建和删除文件,一一进行了详细讲解。此外,异常处理和具体的应用示例使得整个过程变得更加清晰。Clojure语言的文件操作虽然依赖于Java,但通过简洁的函数式编程风格使得操作变得灵活且易于使用。希望这篇文章能够帮助您更好地掌握Clojure语言中的文件操作,并在实际开发中运用自如。

2501_90443945的博客 397

关于Clojure的简单介绍

*注:下面内容翻译自Clojure官网的部分内容,Clojure官网网址为:http://clojure.org/。这里仅为抛砖引玉,故此处保留原文,如觉翻译生硬不通,请移步到官网或参考下面英文部分。 Clojure is a dynamic programming language that targets the Java Virtual Machine (and the CLR

xiejianming的专栏 1057

Clojure语言的Web开发

Clojure是一种 Lisp 方言,具有一些高级特性,比如不可变数据结构、并发支持以及在JVM上的运行能力,使其能够与现有的Java库无缝对接。Clojure的核心理念是尽量用少的代码实现复杂的逻辑,强调函数的使用和状态的管理。

2501_90417006的博客 395

clojure_深入了解Clojure系列

clojure InfoQ读者可以 使用结帐代码“ infoq35”, 获得任何版本的 《 Clojure的喜悦》 (早期阅读电子书,或早期阅读电子书+印刷书)的 35%独家折扣 。 优惠有效期至2010年6月16日。 如果您熟悉Clojure编程语言,那么您可能会知道它的核心是一组强大的不可变,持久性的集合类型。在本文中,我们将讨论这些集合类型的基础,包括深入探讨变成几个 即其向量和地图。...

cunfu6353的博客 887
上一篇: clojure实战——基于logstash搭建日志数据获取与整理平台(2)
下一篇: datomic数据库——ACID(1)
蜗牛lz
博客等级 码龄15年 17粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值