首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Clojure与LispClojure与Lisp

Lisp一种编程语言,表达性和功能强大著称,但人们通常认为它不太适合应用于一般情况。Clojure 是一种运行在 Java™ 平台上 Lisp 方言,它出现彻底改变了这一现状。...思想8和思想9,意味着你可以写出一种能够自己编程程序。这可能听起来很怪异,但是对于Lisp语言却是再普通不过。最常用做法就是使用宏。 术语"宏"在Lisp语言中,与其他语言中意思不一样。...如果你创造了一种新语言,其中有car、cdr、cons、quote、cond、atom、eq这样功能,还有一种函数写成列表表示方法,那么在它们基础上,你完全可以推导出Lisp语言所有其他部分。...如今,在任何具备 Java 虚拟机地方,都可以使用 Lisp 强大功能。 Clojure 是一种函数编程语言 它囊括了函数编程所有精华: 避免了不稳定状态、递归、更高阶函数等。...(4)清晰:纯函数(前面提到),immutable var,immutable数据结构,STM避免锁问题。不可变减少了心智负担,降低了多线程编程难度,纯函数也更利于测试和调试。

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

函数编程很难,这正是你要学习它原因

可以打保票说,如果你还不曾有过这样认识,一旦你学了一种Lisp语言,你会发现所有的Lisp变种都很相似。   有人说,大部分人第一次使用Haskell或Ocaml时都完全不知所措。...这并不是语法问题;Haskell和ML语言完全基于一种不同概念、一种语言范式。你需要用不同方式开发应用,不同方式组织应用,不同方式扩展应用。   ...对我而言,我已经惊奇于由于这样思维而阻止他们学习函数语言现象;他们需要学习一种跟指针和递归一样基础新概念。他们需要有一种只有专业人员在完成清晰商业目标时才具有的耐心和斗志。...很少人能在过了可塑年龄后还受得了一次又一次挫折,否则我们现在都早成专家了,不是?   还有更复杂东西,有大量语言和算法研究都是用函数语言实施(尤其是Haskell)。...这种定义方式几乎是滑稽可笑,但它能让你想到函数概念。另外一个好例子是Scala语言如何利用完备Java Fork/Join 类库,把它轻松集成自己自有语法中。

99651

如何编写高质量 JS 函数(3) --函数编程

按照 FP 思想,不能使用循环,那我们该如何去解决? 抛出异常会产生副作用,但如果抛出异常,又该用什么替代呢? 函数编程不允许使用可变状态?如何没有副作用表达我们程序?...你会发现只能用递归实现循环、没有 try catch 等要求,是合理且合适。 PS: 这就好像是一直使用函数语言的人突然接触命令语言,也会满头雾水。 七、函数编程不允许使用可变状态?...如何没有副作用表达我们程序? 可以使用局部可变状态,只要该局部变量不会影响外部,那就可以说改函数整体是没有副作用。 八、为什么函数编程建议消灭掉语句?...所有的数据都应以参数形式提供给函数,而 this 遵守这种规则。 二、为什么JS函数内部可以使用for循环? 很多人可能没有想过这个问题 其实在纯函数语言中,是不存在循环语句。...缺少不可变数据结构( JS 除了原始类型,其他都是可变) 没有提供一个原生利于组合函数而产生新函数方式,需要第三方支持 不支持惰性序列 缺少尾递归优化 JS 函数不是真正纯种函数语言中函数形式

1.7K00

函数编程简介

n = n (λb.FALSE) TRUE add = succ n1 n2 函数编程语言发展 在这之后,随着通用计算机产生,人们发觉使用机器码写程序太没有效率。...[y] ((x x) y))))))) Lisp、ML以及Haskell关系 Lisp是动态语言,使用S表达式 ML和Haskell都是静态强类型函数语言 ML...功能内聚好理解(分块)和局部性影响(控制可变性)。函数编程同样考虑这些,功能内聚不一定要用类方式(考虑一下JSprototype,也是一种面向对象),只要模块做得好,一样能达到效果。...局部性影响,其本质是封装可变因素以避免其扩散到代码各处。函数给出了自己答案,消除可变因素。 高阶函数和惰性求值也非常有利于模块化。...利用Ideal Hash Tree特点可以快速索引出数据,与此同时,数据“增删改”也能做到近常数化时间,并且总是产生新数据结构替换原有的数据结构,即一种可变链式存储结构。 ?

1.6K41

Python迎来新挑战:LeCun站台Skip语言有机会成为深度学习语言

包括安全并发、具有类型推断强类型化、简单语法、面向函数可以面向对象、默认不可变变量、可预测垃圾回收器、支持预计算和缓存、类Lisp:闭包和指令序列等。...在实践中,这意味着开发者可以用可预测GC开销来编写代码。 Skip另一大特点是将函数和面向对象观点混合在一起,所有这些都被仔细地整合在一起,形成一种有聚合力语言。...像命令/OO语言一样,Skip支持具有继承性类、可变对象、循环和提前返回。...可以看到,函数需要类型注释:指定了返回类型(void),名为 main 特殊函数被调用作为程序入口点。 Skip 是一种类型化语言。函数参数、返回类型和类别字段等声明都包括类型注释。...并且函数没有使用关键词 return,因为 Skip 是一种基于表达式语言,即没有语句概念。 修改本地变量时需要使用感叹号,等号作为声明局部变量操作符。

32550

Scala简介:面向对象和函数编程组合

Scala简介 “Scala是一门现代多范式编程语言,志在简练、优雅及类型安全方式来表达常用编程模式。它平滑地集成了面向对象和函数语言特性。”...使用表达式如s.replace(';', '.')在字串里替换字符会产生一个新,不同于原字串s对象。用另一种表达方式来说就是在Java里字串是不可变(immutable)而在Ruby里是可变。...例如,Scala有不可变列表,元组,映射表和集。 另一种说明函数编程第二种理念方式是方法不应有任何副作用:side effect。它们唯一与所在环境交流方式应该是获得参数和返回结果。...函数语言鼓励不可变数据结构和指称透明方法。有些函数语言甚至需要它们。Scala给你选择。如果你需要,你也可以写成命令:imperative形式,用可变数据和有副作用方法调用编程。...但是Scala通常可以在你需要时候轻松避免它们,因为有好函数编程方式做替代。

1.2K60

又要头秃?2020年七大AI编程语言大盘点

虽然有很多编程语言可以让你在人工智能上开发领域轻松起步,但是没有一种编程语言可以成为人工智能编程“一站”解决方案,因为每种编程语言都有自己独特之处。目的不同,对语言要求也会不同。...Keras,作为高度复杂数学计算和操作代码接口。 SparkMLlib,类似于Apache Spark机器学习库,使用算法和实用程序等工具使得机器学习对每个人都可以轻松。...使用R语言,你可以各种编程模式工作,如函数编程、矢量计算和面向对象编程。 R语言可供使用一些AI编程包有: Gmodels,提供了用于模型拟合多个工具集合。...Haskell发布于1990年,著名数学家Haskell Brooks Curry名字命名,它是一种函数和强静态类型编程语言,经常和延迟计算和较短代码搭配使用。...每一种人工智能编程语言都有各自优缺点。 随着这些语言不断改进,很快人工智能开发就会变得比现在更加轻松和高效,更多人就可以加入到这股创新浪潮中来。

1.7K20

高薪AI工程师都在用什么编程语言?2020 年七大 AI 编程语言大盘点

虽然有很多编程语言可以让你在人工智能上开发领域轻松起步,但是没有一种编程语言可以成为人工智能编程“一站”解决方案,因为每种编程语言都有自己独特之处。目的不同,对语言要求也会不同。...Keras,作为高度复杂数学计算和操作代码接口。 SparkMLlib,类似于Apache Spark机器学习库,使用算法和实用程序等工具使得机器学习对每个人都可以轻松。...使用R语言,你可以各种编程模式工作,如函数编程、矢量计算和面向对象编程。 R语言可供使用一些AI编程包有: Gmodels,提供了用于模型拟合多个工具集合。...——Larry Wall Haskell 官网 Haskell发布于1990年,著名数学家Haskell Brooks Curry名字命名,它是一种函数和强静态类型编程语言,经常和延迟计算和较短代码搭配使用...每一种人工智能编程语言都有各自优缺点。 随着这些语言不断改进,很快人工智能开发就会变得比现在更加轻松和高效,更多人就可以加入到这股创新浪潮中来。

1.8K20

Java 8函数编程学习

其中有些语言想分离程序状态和函数一种看起来有点对立方式使用面向对象语言,这通常会将它们联系得更紧密)。...非函数编程语言中函数编程 一种语言是不是函数并不是非此即彼状态,实际上,语言存在于图谱上。在最末端,基本上是强制函数编程,通常禁止可变数据结构。...Clojure就是一种不接受可变数据语言。 不过,也有一些其它语言,通常以函数方式编程,但语言并不强制这一点。Scala就是一个例子,它混和了面向对象和函数语言。...2)这个特定程序如何使用语言提供函数特性?它是否避免了非函数特性,例如可变状态?...最后,让我们回到本文开头提出问题,“Java 8函数编程怎么样?” Java 8之前,如果开发者想函数风格编程,他或她只能使用嵌套类型(通常是匿名内部类)作为函数代码替代。

92970

Clojure 开发那些事

其实也好理解,Lisp 语言诞生这么久了,为什么一直那么小众?原因就在于 Lisp 语言过于强大,不必也不可能像 Java 那么普及。你能要求每个人都能为 CTO ?...,很幸运,Clojure 里面函数是一级成员,这意味着函数可以作为参数传入,也可以作为函数值返回,能够进行这两类操作函数称为“高阶函数”(high-order functions),这在任何一门函数语言中都很普及...语言非常详细介绍 https://clojuredocs.org/,可以方便查看函数方法 数据不可变 括号问题适应后,另一个比较挑战是数据可变性,这融合在 Clojure 语言设计之中,表象就是没有赋值语句了...“操作系统”,对括号著称 Lisp 语言有天然支持,括号匹配主要是 Paredit mode,可以方便把括号作为一个整体操作,不过像 Cursive 这种插件也集成了 Paredit 主要功能...nrepl Clojure REPL 可以连接到远程服务器上进程中,直接对进程中函数或变量进行修改,这是非常便利,对于很多运行时错误可以采用这种方式解决,Emacs 与 Intellj 里面都提供了连接远程

1.5K20

为什么Lisp语言如此先进?(译文)

如果你创造了一种新语言,其中有car、cdr、cons、quote、cond、atom、eq这样功能,还有一种函数写成列表表示方法,那么在它们基础上,你完全可以推导出Lisp语言所有其他部分。...六、 就算Lisp确实代表了目前主流编程语言不断靠近一个方向,这是否意味着你就应该用它编程呢? 如果使用一种不那么强大语言,你又会有多少损失呢?有时采用最尖端技术,也是一种明智选择?...这么多人使用主流编程语言,这本身也说明那些语言有可取之处? 另一方面,选择哪一种编程语言,许多项目是无所谓,反正不同语言都能完成工作。一般来说,条件越苛刻项目,强大编程语言就越能发挥作用。...    return function (i) {       return n += i } } (实事求是地说,Perl也保留了语句和表达式区别,但是使用了典型Perl方式处理,使你可以省略...而且尽管Python确实支持函数数据类型,但是没有一种字面量表示方式(literal representation)可以生成函数(除非函数体只有一个表达式),所以你需要创造一个命名函数,把它返回。

1.2K60

Java函数开发——优雅Optional空指针处理

在Java8中,Optional为函数编程null处理给出了非常优雅解决方案。本文将说明长久以来Java中对null蹩脚处理,然后介绍使用Optional来实现Java函数编程。...如果你玩过一些函数语言(Haskell、Erlang、Clojure、Scala等等),上面这样是一种很自然写法。用Java当然也可以实现上面这样编写方式。...但是为了完满处理所有可能出现null异常,我们不得不把这种优雅函数编程范式改为这样: ? 瞬间,高逼格函数编程Java8又回到了10年前。这样一层一层嵌套判断,增加代码量和优雅还是小事。...总的来说,我们可以将任何数据结构用Optional包裹起来,然后使用函数方式对他进行处理,而不必关心随时可能会出现null。...第一种方法可以平滑和已有的JavaBean、Entity或POJA整合,而无需改动什么,也能更轻松整合到第三方接口中(例如springbean)。

1.5K10

翻译连载 |《你不知道JS》姊妹篇 |《JavaScript 轻量级函数编程》- 引言&前言

第 5 章:减少副作用 什么是副作用 一次就好 纯粹快乐 有或者无 纯化 第 6 章:值可变性 原始值可变性 从值到值 重新赋值 性能 可变眼光看待数据 第 7 章: 闭包 vs...函数编程是一种编程范式,Kyle 倡导使用它来实现声明编程和函数编程,同时该范式还可以与 JavaScript 世界形成平衡和互动。...事实上,已经有很多从头到尾(正确方式)介绍函数编程书了。如果你在深入学习函数编程,这些专业术语有很重要意义,你肯定会对这些专业术语越来越熟悉。 但是本书打算一种方式讲解函数编程。...在我看来,函数编程核心在于让你在编程时使用一些广为人知、易于理解模式。经过验证,这些模式可以有效隔离让代码难以理解错误。...科班出身函数编程者经常宣称只有 100% 使用函数编程才算是真正地使用函数编程:这是一种要么全有要么全无主张。

38320

Lisp本质(The Nature of Lisp)学习思考

这听起来疯疯癫癫, 实际上却是必然之事。我许诺过会一种全新方式来解释Lisp, 我要重申我许诺。但是我们此刻还没有到预定地方, 所以还是先继续上边讨论。...想想看吧, 为了写结束标签, 每个词都得打两遍, 不发疯算好! 为了解决这个问题, 我们应当简化写法。须知, XML仅仅是一种表达层次化数据方式。我们并不是一定要使用尖括号才能得到树序列化结果。...Lisp函数角色十分特殊, 函数也是一种数据类型, 就像整数和字符串一样, 因此可以把它赋值给符号。乘法函数Lisp内置函数, 默认赋给*, 你可以把其他函数赋值给*, 那样*就不代表乘法了。...但是我们可以更好。我们先提一个问题, 怎样写一个工具, 通过查找目录结构中源文件来自动生成Ant脚本。 用字符串处理方式生成Ant脚本是一种简单方式。...我们已经说过了DSL好处, 这也就是Ant用XML而直接用Java原因。如果使用Lisp,我们可以任意创建DSL, 只要我们需要。

1.7K60

Java并发-推荐使用可变对象原因分析

可变对象就是这样一种诞生之后就完全不再变更对象,该类对象可以天生支持无忧无虑地在多线程间共享。...其实,所有的函数编程语言Lisp、Haskell、Erlang等,都从语法层面保证你只能使用可变对象,所以所有函数编程语言是天生对并发友好,这也是在一些高并发场景中,函数编程语言更受青睐原因。...2.3 不可变对象局限 2.3.1 编程思维转变 如果所有对象都被设计为不可变,等价于使用函数编程思维,编程思维上变化并非所有程序员都能很好适应,如果适应不了,强行推广只会适得其反。...况且Java本身也并不是纯粹函数编程语言。 2.3.2 性能上额外开销 由于不可变对象需要复制一份状态用于修改后返回新对象,如果设计和使用不当的话,可能因此形成性能瓶颈点。...比如颜色数值和颜色名可以因为多线程调动而对应上。 3.2定义不可变对象策略 以下一些规则是创建不可变对象简单策略。

56220

“无状态”那点事儿

(奇怪地问道)这不就是一个函数?我初中就学过, 给定一个x,函数经过计算(比如求平方)就能得到一个y。 没错,这就是一个纯函数,对于相同输入,总是得到相同输出,不依赖于外界状态。...那这么说来,这个服务器也不会记录每次请求是谁,只要执行这个'函数调用'就可以了。 你说说,这样HTTP协议有什么好处?...由于没有状态,如果一个服务器访问量过大,我可以轻松地添加新服务器来处理请求。 image.png “孺子可教也,这就是所谓水平扩展(scale-out)。 水平扩展?...对,垂直扩展就是通过增加CPU,内存,硬盘等方式来提高单个服务器处理能力。由于单台机器总是有上限,所以想应对海量用户访问,提高可用性,还得靠水平扩展。现在你体会到无状态好处了吧?...这样的话当多个线程调用add对象时候,都是线程安全。 我这里有一副图画,是LISP大师送给我,形象地展示了可变 vs 不可变, 你拿去吧: 那代价也有点大啊,每次都创建新对象!

44620

NUS CS1101S:SICP JavaScript 描述:前言、序言和致谢

要仔细回答这个问题,我们首先需要问这个数据结构是否“通用”:它是否可以方便地满足那 10 个更专门数据结构作用? 就此而言,我们还可以问:我们真的需要 100 个函数?...如果我们给这些函数和专门视角起好名字,这是可以管理。 当你阅读这本书时,请不仅注意编程语言构造和它们使用方式,还要注意给函数、变量和数据结构起名称。...它们并不都像 Iverson 为他 APL 函数选择那样简短和生动,但它们是以一种有意识和系统方式选择增强你对整体程序结构理解。...原语、组合方式函数抽象、命名以及使用通用数据结构约定方式来专门区分:这些是一个良好编程语言基本构建块。从那里开始,想象力和基于经验良好工程判断可以做剩下事情。 —Guy L....我们可以进行过程和数据抽象,我们可以使用高阶函数来捕捉常见使用模式,我们可以使用赋值和数据变异来模拟局部状态,我们可以使用流和延迟求值来链接程序部分,我们可以轻松实现嵌入语言。

11010

深入理解函数编程(下)

一方面,这种副作用管理方式一种高级抽象形式,不易理解;另一方面,我们在学习和使用函数编程过程中,几乎都会遇到类似的副作用问题需要解决,能否解决这个问题也决定了一门函数编程语言最终是否能走上成功...其他编程语言特性,在函数编程中也能找到对应影子,比如循环结构,我们往往使用函数递归来实现。 IO处理方式 终于到IO了,如果不能处理好IO,我们程序是健全。...希望本文能帮助大家理解什么是函数编程。 现在我们来回顾先览,实际上,函数编程也是程序实现方式一种,它和面向对象是殊途同归。...额外抽象负担 当程序有大量可变状态、副作用时,用函数编程可能造成额外抽象负担,项目开发周期可能会延长,这时可能用其他抽象方式更好(比如OOP)。...Q:你愿意在生产中使用Haskell/Lisp/Clojure等纯函数语言? A:不论是否愿意使用,现在很多语言都开始引入函数编程语法了。并不是说函数编程一定是优秀,但它至少没有那么恐怖。

41210

函数编程那些事儿

函数编程是一种编程范式,在其中它试图将每个函数都绑定到纯数学函数中。这是一种声明编程风格,着重于解决什么而不是如何解决。...Clojure,Common Lisp,Erlang,Haskell和Scala是遵循函数编程方法一些著名编程语言。...变量是不可变 变量是不可变,即变量一旦初始化就无法修改。尽管我们可以创建一个新变量,但不允许修改现有变量。 函数编程语言中变量不变性质在整个程序执行过程中保持状态形式受益。...因此,它们不会产生任何隐藏输出。它们使用可变值,从而使调试和测试更加容易。 它样式将函数视为值,并将其作为参数传递给其他函数。它增强了代码理解性和可读性。...缺点 不变值与递归结合可能会导致性能下降 在某些情况下,编写纯函数会导致代码可读性下降 尽管编写纯函数很容易,但是将其与应用程序其余部分以及I / O操作结合起来很困难 递归方式编写程序来代替使用循环

83140
领券