首页
学习
活动
专区
圈层
工具
发布

不学函数式设计的3大损失

那么有没有一种编程语言,能从根源上避免这两大坑呢?Clojure就是这样一门语言。Clojure如何从根源上避免Java并发编程两大坑Clojure默认数据是不可变的,这从根源上减少了大量并发bug。...在Clojure函数式编程中,"不可变"(immutable)指的是一旦创建,就不能被改变的数据。具体来说,首先创建后的数据不能被修改。如果需要"改变",实际上是创建了一个新的数据副本。...对于失误1"直接返回内部状态",函数的封装能从根源上避免现在我们看看Clojure是如何从根源上避免Java并发代码的5大坑的。对于失误1"直接返回内部状态",Clojure函数的封装能从根源上避免。...第三,atom会尝试用这个新值替换旧值,但在替换之前,它会检查当前值是否还是你开始计算时的那个值。如果值没有改变,那么替换并更新成功。如果值已经被其他线程改变了,atom会重试整个过程。...let用于在局部范围内定义符号和数据结构的绑定。那还有20%的语法怎么办?我的方法是用最喜欢的生成式AI,帮你逐行解释我在github上分享的那93行Clojure代码。

74954

改善单元测试的新方法|洞见

想法很美好,但如何实践Given、When、Then呢?答案是让程序自动生成入参并验证结果。...整个分析和构造的过程中,都没有涉及具体的数据,这样会强制我们揣摩输入数据可能的模样,而且也能避免测试意图被掩盖掉——正如前面所说,return 3 when add 1 and 2并不代表什么,return...我们常常会发现,在写完上组测试用例的实现之后,无需任何改动,下组测试照常能运行通过。换句话说,实现代码可能做了多余的事情而我们却浑然不知。...基于用例的单元测试和生成式测试在这两点上是相辅相成的。我们可以借助它们尽可能早地发现更多的缺陷,避免它们逃逸到生产环境。...Clojure.spec提供方法很有前景,它可以让开发者在需要的时候,就能从类型和取值范围中获益。 另外,除了Clojure,其它语言也有相应的生成式测试的框架,你不妨在自己的项目中试一试。

1.1K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    大数据那些事(32):风暴,山寨风暴和遥遥无期的风暴二代

    Stratosphere的投票表明89%的人不知道这个是什么鬼东西。但是我想这些人都知道Flink是什么。很有意思的一个数据。 周末遇到一个和我差不多时候做公众号的大姐闲聊。...于是对方教育我说女人和小孩的钱好赚,你开这公众号写东西给程序猿看。写得再好也难让人掏腰包啊。我实在不知道该如何接这个话,只得点头承认自己的公众号做得实在不成功,比不上大姐。...Storm是用clojure写的。这个语言是个函数式编程语言,但是跑在JVM上。和Scala这种大杂烩比,又更纯粹一些。...选择Clojure来写这样一个平台是不是好,我想很难一棍子打死。但是起码的,两条腿写Java的码农不缺,两只手写Clojure的码农,尤其是有经验的资深码农,不是玩票的,不好找是事实。...但是无论如何,我觉得JStorm这个项目展现出了中国人在开源的世界里面的拳头和实力。是非常值得骄傲的事情。

    91980

    Clojure与LispClojure与Lisp

    你在程序运行的时候取修改程序,而不需要重新编译或重启 程序....Clojure 语言在直觉和观感上比历史上的lisp更易于阅读. 在后面开始学习的初级阶段,你就发现虽然 仍有各种括号,但是代码是难以置信的容易读和写....language); 在运行期读取代码,使得程序之间可以用S-表达式(S-expression)通信,近来XML格式的出现使得这个概念被重新"发明"出来了。...Clojure 是一种函数式编程语言 它囊括了函数式编程的所有精华: 避免了不稳定状态、递归、更高阶的函数等。...Clojure 不仅可在 JVM 上运行,而且可以与Java无缝融合(JVM平台的语言家族原则上都支持)的互操作性。最后,Clojure 在设计上也考虑了并发性,并具有并发编程的一些独特特性。

    2.4K30

    一名Clojurian的Emacs配置

    类似地,.vimrc配置文件在网络上也多如牛毛,华丽和酷炫的插件极大地提升了vim的操作性。尽管如此,我还是乐于一砖一瓦地打造自己的vim环境,竭力演化它变成我心目中的“编辑器之神”。...膨胀本来算不上问题,但我是个比较有操守的程序员,臃肿的代码是我极力避免的坏味道(bad smell)。 所以胸臆之中涌动一股浩然之气,决心学起emacs lisp,把emacs的配置从头来过。...当你正在编译文件的时候,包中宏就会原地展开,然后被eval-when-compile宏加载进内存并被编译成字节码,供后续解析器执行。...最后,需要在init.el文件中添加入这么一句(require 'init-clojure-cider),重新启动emacs,找到一个Clojure项目,按下C-c M-j (hack-jack-in)...如果大家对我的配置感兴趣,可以直接去我github上dotfiles上查看。 — 参考链接 [1] sriramkswamy dotemacs [2] purcell emacs.d

    3.2K20

    Java扩展Nginx之二:编译nginx-clojure源码

    如果说问题1可以通过等待来解决,那么,假设咱们的nginx不仅需要nginx-clojure能力,还需要集成其他第三方或者自研模块,那又该如何呢?...所以,nginx-clojure提供的安装包,只能作为一个学习工具,帮助咱们熟悉nginx-clojure技术框架,或者在开发的时候用到,至于生产环境就不适合了 此刻,经验丰富的您一定看出了欣宸的套路:...啰啰嗦嗦、拐弯抹角扯了这么多,可以给出解决方案了吧,嗯嗯,既要用上nginx-clojure,又要避免上述两个致命问题,最合适的方案应该是:下载nginx和nginx-clojure的源码,自行编译和安装...raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein \ && chmod a+x /usr/bin/lein \ && lein 实测在腾讯云服务器上执行上述命令...,就用前文的Hello World功能吧 前文的jar包,我已经上传到GitHub上,下载到/usr/local/nginx/jars/目录下: curl -o /usr/local/nginx/jars

    55020

    Clojure component 设计哲学

    Component 需要依赖我的 dependency 库 讨论 请在 Clojure Mailling List 提问。...内存式缓存:在一个共享的可变引用当中获取或者设置数据的函数,比如 Clojure 中的 Atom 或 Ref。 Component 和面向对象编程里的对象定义在理念上很类似。...你必须显式地在 component 之间指定依赖关系,代码本身不能自动发现这些关系。 最后,component 之间不允许有环依赖。我相信环形依赖通常都暗示架构有瑕疵,可以通过重新构造应用得以消除。...在极少数的情况下,环形依赖无法避免,那么你可以使用可变的引用来管理它,不过这就超出了 component 的范围。...我不希望通用库在使用它的应用程序上强加任何特定的框架。

    1.3K00

    如何高效地学习编程语言

    更进一步,你可以在阅读材料之前先去行测试,举个例子,尝试在阅读一个章节之前做做练习。值得一提的是,这也被证明有助于记忆的形成。...(在写《Clojure for Brave and True》的时候,我常常这么干。这样能够以外行的话阐述一个想法,进而迫使你深入理解想法本身。) 这些技巧的大部分都要规约到编写代码上!...个人来讲,如果纠结在某事上,我真的会洗个澡,这个技巧的功效显著。另一方面,我又是多么干净(注:洗澡这件事)。...工具的内部模型就是如何将输入到其接口转换成一些底层的抽象。Clojure 把 Lisp 转换成 JVM 的字节码。Ansible 把任务定义转换成了 shell 命令。...在一个理想国中,你不需要理解工具的内部模型,但事实上,理解内部模型总是有用的,因为在某些看上去迷惑或者矛盾的部分,它可以让你有个统一视图。

    1.2K60

    软件随想录

    作为一个C程序员,在数次领教了这句话的威力后,我终于在去年末杀入Lisp阵营,首先拿了racket开刀,学得如痴如醉,随后又禁不住诱惑,跳入clojure这个golden club,接受Rich Hickey...可是performance和解释器实现上的先天不足(Guido/Matz其实挺冤:我给你们个电钻,你们非要用它来钻钢板,性能不好,怪我咯)是其破绽,导致遇到计算密集/IO密集型的问题,处理起来很是伤肾。...作为程序员,我们很容易进入到programmer-centric的境界: 这特么不是bug,用户用错了 提这需求的客户太2B了 要的功能已经实现了,没人用不是我的错 商业上看中的是 cost/benefit...软件烂,欠了一屁股技术债,总是能通过招入更好的人进来慢慢弥补的;业务烂,软件再NB,CI pipeline轻舞飞扬,又如何?...你不锻炼business vision,找不到产品能被人使用,客户愿意购买的点,只能是打工的角色(做到CTO也是打工的角色);即便创业,也是一个理论上来说容易被替换的角色。

    90190

    Clojure 运行原理之字节码生成篇

    上一篇文章讲述了 Clojure 编译器工作的整体流程,主要涉及 LispReader 与 Compiler 这两个类,而且指出编译器并没有把 Clojure 转为相应的 Java 代码,而是直接使用...本文将主要讨论 Clojure 编译成的 bytecode 如何实现动态运行时以及为什么 Clojure 程序启动慢,这会涉及到 JVM 的类加载机制。...但是在正式的生产环境,这种重定向对性能有影响,而且也没有重复定义函数的必要,所以可以在服务启动时指定-Dclojure.compiler.direct-linking=true来避免这类重定向,官方称为...慢启动 明白了 Clojure 是如何实现动态运行时,下面分析 Clojure 程序为什么启动慢。...总结 Clojure 作为一门 host 在 JVM 上的语言,其独特的实现方式让其拥动态的运行时的同时,方便与 Java 进行交互。

    1K20

    Storm创始人Nathan Marz:反馈即一切

    Nathan:我十岁那年开始在自己的TI-82图形计算器上写程序。原因是我想在它上面开发游戏,也是因为那时我在数学课上感到太无聊了。...我在计算器上写出的头一个有趣的程序是款射箭游戏——玩家向移动的目标发射箭头,命中的目标越多,或任务完成得越快,都能得到更多分数。几年后,当我毕业时,就在TI-89上写程序了。...对我而言,学习Clojure,让我在使用所有其他语言编程时也都大获提高。 《程序员》:请谈谈你加入BackType前的经历。...Nathan:我所见到最普遍和严重的一种误解是,人们往往对关系型数据库与相关理论(如CRUD)顶礼膜拜。将RDBMS视为终极的数据库技术,并且似乎每个人都尝试在大数据的版图上重新实现RDBMS。...其二是“到达问题”——计算机如何才能快速获取发布在Twitter上的链接,它需要计算所有用户的关注者发布的全部链接。这是一项高度的计算密集型任务,难以预先处理。

    1K40

    如何高效地学习编程语言

    更进一步,你可以在阅读材料之前先去行测试,举个例子,尝试在阅读一个章节之前做做练习。值得一提的是,这也被证明有助于记忆的形成。...(在写《Clojure for Brave and True》的时候,我常常这么干。这样能够以外行的话阐述一个想法,进而迫使你深入理解想法本身。) 这些技巧的大部分都要规约到编写代码上!...个人来讲,如果纠结在某事上,我真的会洗个澡,这个技巧的功效显著。另一方面,我又是多么干净(注:洗澡这件事)。...工具的内部模型就是如何将输入到其接口转换成一些底层的抽象。Clojure 把 Lisp 转换成 JVM 的字节码。Ansible 把任务定义转换成了 shell 命令。...在一个理想国中,你不需要理解工具的内部模型,但事实上,理解内部模型总是有用的,因为在某些看上去迷惑或者矛盾的部分,它可以让你有个统一视图。

    86840

    GitHub 上这个教人从零开始造轮子的项目又强势登上热榜!

    (只要是)我不能创造的,我就(还)没有理解 - Feynman 作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个在划水界鼎鼎有名的蒟蒻......我在之前介绍过一个项目 - Learn X in Y Minutes ,它包括了很多的简短教程,可以在短时间内让我们了解一门未知的技术或者编程语言,但仅仅有这个还远远不够,我们学习一门技术或者编程语言的目的不仅只是了解一下就够了...那么问题来了,如何才能证明自己是“学会”了呢?其实文章开头就给出了答案,费曼那句广为流传的名言,“我不能创造的,我就还没有理解”,那反过来,只要能创造的,那我就学会了......再比如 Build your own Game(创建你自己的游戏) 不知道你发现了没有,对于每个技术领域的教程,有 C、C++、Java、Python、Go 这些当下常用或者流行的编程语言,还有 Clojure...、Haskell、F# 这种小众编程语言,可选择的语言极多,可以说基本上适合各种编程语言的学习者去学习,真是不知道怎么去夸了,反正真香就完事儿了...

    1.2K20

    【译】深入 Roam 数据结构 —— 为什么 Roam 远不只是一个笔记应用

    我在可下载的 roam.json 文件中包含了稍微高级一点的查询版本,它将可用于排序。我在 clojure.core 文档中找到了namespace 函数。...除了clojure.core命名空间之外,Clojure 函数必须是完全命名空间限定的。遗憾的是,在核心命名空间之外,我只找到了几个在 Roam 中能用的函数。...这样我就可以避免在你的 Graph 中出现不必要的块数。...我按照以下逻辑来呈现查询结果。 我将把结果集的顶层显示为表的行,值为列。 结果集中的嵌套层会交替以列或行的方式呈现。 为了避免结果集过大,MAXROWS 默认设置为 40。...你可以在下面的评论中联系我,或者在 Twitter 上@zsviczian。 另外,我很想了解你是如何使用从这篇文章中学到的知识,以及如何使用 SmartBlock 的。请分享你的想法和成果。谢谢你!

    1.8K10

    【软件架构】为杠杆(利用率)架构设计软件

    太多的未知数,我们不知道公司将走向何方,也不知道它是否会成功。有限的资源,只有十几个人在管理整个公司,我们需要让这一切顺利进行。在我们的案例中,我们有一个许可期限。...太多的未知数,我们不知道公司将走向何方,也不知道它是否会成功。有限的资源,只有十几个人在管理整个公司,我们需要让这一切顺利进行。在我们的案例中,我们有一个许可期限。...我们选择了Clojure,这是一种在JVM上运行的函数式编程语言。我们可以利用整个Java生态系统。所有用Java编写的东西,我们都可以在Clojure中使用。默认情况下,我们获得了不变性。...有了可伸缩性或容错的价值,我们可以而且应该尽可能避免优化,或者至少延迟优化。因为优化代码比常规代码复杂得多。在一个复杂的领域,这可能会很快偏离轨道。...我想,它是从今年开始在圣保罗地区出现的。我想如果我们今天开始创业,我们可能会在亚马逊上使用EKS,就这样。我们当时没有那些工具。

    46220

    实用的函数式编程

    我们又到了在计算机和软件技术上的一个瓶颈期了吗? 所以, 也许函数式编程并不想我们曾经想象的那么重要. 或许我们不会被那么多的核心包围, 也不用去担心在芯片上有 32,768 个核心....我最喜欢的是 Clojure. 因为 Clojure 极其简单. 它是 Lisp 的一个方言, Lisp 是一个十分简单和漂亮的语言....我发现面向对象最有用的一个特性是, 在软件架构层面的动态多态性. Clojure 提供了对 Java 动态多态性的完全接入....实际上, 一个 Clojure 的写程序要去实现这个接口会像 Java 实现一样. 一个 Clojure 程序会通过同样的 token 实现一个 Java 的 interface....故而, 在 Clojure 中, 所有的函数调用都是列表. 列表可以直接被代码操作. 所以, 一个程序也可以构造和执行其他程序. 最后说一句, 函数式编程十分重要. 你应该去学习它.

    1.3K20
    领券