Questions tagged «clojure»

Clojure是支持交互式开发的通用语言,它鼓励功能性的编程风格,并简化了多线程编程。

4
Rich Hickey说道:“ [接口/类/类型]的所有特殊性杀死了您的重用!”是什么意思?
在Rich Hickey 在第29分钟发人深省的goto会议主题演讲“ 值的价值 ”中,他谈论的是Java之类的语言的开销,并声明“所有这些接口都会破坏您的重用”。他什么意思?真的吗? 在寻找答案时,我遇到了: 最少知识原则(又称为“德米特定律”)鼓励密闭的API接口。维基百科还列出了一些缺点。 凯夫林·汉尼(Kevlin Henney)的《帝国服装危机》认为,使用而不是重复使用是适当的目标。 杰克·迪埃德里奇(Jack Diederich)的“ 停止写作课 ”演讲反对一般的过度设计。 显然,任何写得不好的东西都是没有用的。但是,编写良好的API的接口将如何阻止使用该代码?整个历史上都有一些例子,出于一种目的制造的东西被更多地用于其他目的。但是在软件世界中,如果您出于某种非预期目的使用某种东西,通常会破坏它。 我正在寻找一个好的界面的良好示例,该界面可以防止对某些代码的合法但无意的使用。是否存在?我无法想象。

3
Clojure的优点是什么?[关闭]
我最近一直在研究Clojure,偶然发现了Stackoverflow上的这篇帖子,该帖子指出了一些遵循最佳实践的项目以及总体上不错的Clojure代码。在阅读了一些基本教程之后,我想对这种语言有所了解,因此我看了一些“实际”项目。 看完ClojureScript和Compojure(前面提到的两个“好的”项目)后,我觉得Clojure是个玩笑。我不明白为什么有人会选择Clojure,例如Ruby或Python,这是我喜欢的两种语言,它们的语法很简洁,很容易上手,而Clojure 到处都使用了太多的括号和符号,从而破坏了其可读性。我。 我认为Ruby和Python美观,可读且优雅。即使对于完全不了解该语言的人,它们也很容易阅读。但是,Clojure对我来说并不透明,我觉得我必须了解有关语言实现的每一个细微细节,以便能够理解任何代码。 所以,请赐教! Clojure有什么好处? 为了欣赏它,我应该了解的最低语言是多少?
40 clojure 

6
为什么“功能与数据之间的紧密耦合”不好?
我在第40页的“ Clojure的喜悦 ”中找到了这句话。32岁,但上周晚饭时有人对我说了同样的话,我在其他地方也听说过: [A]面向对象编程的缺点是函数和数据之间的紧密耦合。 我理解为什么不必要的耦合在应用程序中不好。我也很高兴地说,即使在面向对象的编程中,也应避免避免可变状态和继承。但是我看不到为什么在类上粘贴函数本质上是不好的。 我的意思是,向类添加功能似乎就像在Gmail中标记邮件,或将文件粘贴在文件夹中。这是一种组织技巧,可帮助您再次找到它。您选择一些条件,然后将类似的东西放在一起。在OOP之前,我们的程序几乎是文件中方法的一大包。我的意思是,您必须将函数放在某个地方。为什么不组织它们? 如果这是对类型的公开攻击,为什么他们不只是说将输入和输出的类型限制为一个函数是错误的?我不确定是否可以同意这一点,但是至少我对pro和con类型安全性论点很熟悉。在我看来,这似乎是一个主要的问题。 当然,有时人们会错误地将功能放在错误的类上。但是与其他错误相比,这似乎是一个很小的麻烦。 因此,Clojure具有名称空间。在OOP中将函数粘贴在类上与在Clojure中将函数粘贴在命名空间中有什么不同,为什么这么糟?请记住,类中的函数不一定只在该类的成员上运行。看一下java.lang.StringBuilder-它可以对任何引用类型进行操作,也可以通过自动装箱对任何类型进行操作。 PS此引用引用了一本书,但我没有读过:《Leda中的Multiparadigm编程》:Timothy Budd,1995年。

7
C#开发人员-我尝试过Lisps,但我不明白。
经过几个月的关于Lisp,CL和Clojure的学习和使用,我仍然看不到有什么理由代替C#编写任何令人信服的理由。 我真的很想提出一些令人信服的理由,或者有人要指出我缺少的东西确实很大。 Lisp的优势(根据我的研究): 紧凑,富有表现力的符号-不仅是C#,是的...但是我似乎也可以用C#来表达那些想法。 对函数式编程的隐式支持-具有LINQ扩展方法的C#: mapcar = .Select(lambda) mapcan = .Select(lambda).Aggregate((a,b)=> a.Union(b)) 汽车/第一= .First() cdr / rest = .Skip(1)....等 Lambda和高阶函数支持-C#具有此功能,并且语法可以说更简单: “(lambda(x)(body))”与“ x =>(body)” Clojure中的“#(”与“%”,“%1”,“%2”很好 与对象分离的方法分派-C#通过扩展方法具有此功能 多方法分派-C#本身没有这种方法,但是我可以在几个小时内将其实现为函数调用 代码就是数据(和宏)-也许我没有“获得”宏,但是我没有看到一个不能将宏的概念实现为函数的示例。它不会改变“语言”,但我不确定这是一种优势 DSL-只能通过功能组合来实现...但是可以工作 无类型的“探索性”编程-对于结构/类,C#的自动属性和“对象”都可以很好地工作,并且您可以轻松地升级为更强大的类型 在非Windows硬件上运行-是吗?在大学以外,我只认识一个不在家中运行Windows或至少在* nix / Mac上运行Windows VM的人。(再说一次,也许这比我想像的要重要,我刚刚被洗脑了……) 自底向上设计的REPL-好的,我承认这确实非常好,我在C#中错过了它。 我在Lisp中缺少的东西(由于C#、. NET,Visual Studio,Resharper的混合使用): 命名空间。即使使用静态方法,我也喜欢将它们绑定到“类”以对它们的上下文进行分类(Clojure似乎有这个,CL似乎没有。) 强大的编译和设计时支持 类型系统允许我确定我传递的数据结构的“正确性” 拼写错误的内容会实时下划线;我不必等到运行时就知道 建议自动进行代码改进(例如使用FP方法代替命令式方法) GUI开发工具:WinForms和WPF(我知道Clojure可以访问Java GUI库,但是对我来说它们是完全陌生的。) GUI调试工具:断点,插入,逐步,值检查器(文本,xml,自定义),监视,按线程调试,条件断点,调用堆栈窗口,可以跳转到任意级别的代码在堆栈中 (为公平起见,我在Emacs + Slime方面的工作似乎提供了其中的一部分,但我偏爱VS GUI驱动的方法) …
37 clojure  lisp 

7
强制性break语句和其他循环检查的功能等效项是什么?
假设我具有以下逻辑。如何在函数式编程中编写它? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } 大多数博客,文章中的示例……我看到的只是解释了一个简单的数学函数“ Sum”的简单例子。但是,我有一个类似于以上用Java编写的逻辑,并且希望将其迁移到Clojure中的功能代码。如果我们无法在FP中执行上述操作,则FP的促销方式不会明确说明这一点。 我知道上面的代码是绝对必要的。编写此程序并非出于将来将其迁移到FP的考虑。

4
JVM对尾调用优化施加哪些限制
Clojure不会单独执行尾部调用优化:当您具有尾部递归函数并且想要对其进行优化时,必须使用特殊形式recur。同样,如果您有两个相互递归的函数,则只能使用来优化它们trampoline。 Scala编译器能够为递归函数执行TCO,但不能为两个相互递归函数执行TCO。 每当我阅读这些限制时,它们总是归因于JVM模型固有的某些限制。我对编译器一无所知,但这使我有些困惑。让我举一个例子Programming Scala。这里的功能 def approximate(guess: Double): Double = if (isGoodEnough(guess)) guess else approximate(improve(guess)) 被翻译成 0: aload_0 1: astore_3 2: aload_0 3: dload_1 4: invokevirtual #24; //Method isGoodEnough:(D)Z 7: ifeq 10: dload_1 11: dreturn 12: aload_0 13: dload_1 14: invokevirtual #27; //Method improve:(D)D 17: dstore_1 18: goto 2 因此,在字节码级别,只需要一个goto。实际上,在这种情况下,繁琐的工作由编译器完成。 基础虚拟机的什么功能将使编译器更轻松地处理TCO? …
36 scala  clojure  jvm  tail-call 

13
语言不受欢迎的开发中的问题(例如维护)
我正在团队中单独使用clojure(lisp)开发一些应用程序。它从小应用程序开始。没问题。但是,由于它具有功能并扩展了区域,因此它已成为重要的程序。 我担心维护等问题。我们团队中没有人知道Clojure或Lisp,也不对诸如此类的语言感兴趣。 因此,用不受欢迎的语言进行编程不是错误的做法吗?(为了我自己的乐趣?)我应该使用更多流行的语言吗?(至少像python) 我确定我是否要离开团队,而不是说我要离开。:)-没有人​​会维护它。该程序将被销毁,部分程序将使用其他语言进行开发。 尽管我非常喜欢使用clojure进行开发,但我发现这可能不适合我的团队。 你怎么看待这件事?我认为许多喜欢不受欢迎的语言的程序员都在关注类似的问题。

3
在通往启蒙的道路上:计划,常见的Lisp,Clojure?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 8年前关闭。 当我学习Lisp时,许多比我聪明的人会继续写书,因为您“了解它”,它使您成为更好的程序员。 也许我所听到的有关Lisp改变生活的所有信息只是对新手的一个恶作剧,但我认为了解更多关于世界的信息并没有什么害处,即使我发现我是在被sn口之类的东西之后被送去的。 我想遵循SICP或ANSI Common Lisp的规定,但同时要研究可以继续用于个人项目的方言和实现。 SICP专注于Scheme,因此这是一大票。保罗·格雷厄姆(Paul Graham)说,如果他要教新手,他会在Scheme中做,但是听起来Scheme仍然不及Common Lisp。但是接下来是Clojure了-有人告诉我Clojure在某些方面受到限制,但是在其他方面(JVM库)更实用。 听起来我可以更轻松地阅读Scheme的材料,或者从CL那里获得“真正的”启发,或者与Clojure足够接近,并且从长远来看可以做更多的事情。 所有这些中有多少是正确的?我什么时候应该停止思考要学习的内容而只是去学习呢?

5
为什么Lisp社区更喜欢在函数末尾累积所有括号?
为什么Lisp社区更喜欢在函数末尾累积所有括号: (defn defer-expensive [cheap expensive] (if-let [good-enough (force cheap)] good-enough (force expensive))) 为什么不采用C或Java这样的约定? 好吧,Lisp比这些语言要古老得多,但是我说的是当代的Lispers。 (defn defer-expensive [cheap expensive] (if-let [good-enough (force cheap)] good-enough (force expensive) ) ) 注意:代码段摘自《 Clojure的喜悦》一书。

1
交付Clojure桌面应用程序是否现实?
我目前正在运送桌面Java应用程序。这是一个普通的旧的Java 5 Java / Swing应用程序,到目前为止,一切正常。定位Java 5是因为某些用户使用的OS X版本/计算机永远都不会安装Java 6(我们可能很快会取消此限制,而改用较新的Java,而只是放弃使用Java 5的用户)。 我很快就开始了解Clojure,但我还没有真正做过很多Clojure-to-Java和Java-to-Clojure,我想知道是否交付Cloclore桌面应用程序而不是Java应用程序是否现实? 我正在运送的应用程序当前带有所有.jar约12 MB,因此添加Clojure似乎没有太大问题。 我的计划是使用Clojure调用Java API:我的应用程序已经划分为几个独立的jar。 如果我了解正确地从Java调用Clojure比从Clojure调用Java代码难,这就是为什么我基本上要重写所有UI(部分UI,混合Swing组件和自制BufferedImages的原因,无论如何都要重写)视网膜显示),并完成Clojure的所有“布线”。 这就是我面临的问题:交付Clojure桌面应用程序是否现实?(它当然似乎并不广泛,但是随后交付普通的Java桌面应用程序也不是那么普遍,而且我还是这样做了) 从技术上讲,需要做什么?(与交付Java应用程序相比)



3
Clojure是否具有延续/协程/等?
我开始使用Python进行编程,但对协程和闭包之类的概念确实感到困惑。 现在,我认为我在某种程度上是认识他们的,但是我从来没有感受到过“启蒙”的时刻,所以我选择学习Clojure。我买了斯图尔特·哈洛韦(Stuart Halloway)的书,它很好,但是当我查看索引时,并没有像协程或延续这样的词。我用谷歌搜索,但也没有。 所以,我的问题是: Clojure是否具有连续性或协程来执行诸如ping应答之类的任务而没有堆栈溢出? Python示例(尽管标准Python不支持此对称协程的全功能版本): def ping(): while 1: print "ping" function to switching to pong def pong(): while 1: function to switching to ping print "pong"

6
评论写作和文档的最佳实践
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 7年前。 如今评论比以往任何时候都容易。在Java中,有一些将注释链接到类的很好的技术,而Java IDE擅长为您创建注释外壳。像Clojure这样的语言甚至都允许您在函数代码本身中添加对函数的描述作为参数。 但是,我们仍然生活在一个时代,好开发者经常发表过时或较差的评论-我对提高评论的鲁棒性和实用性很感兴趣。 特别是在这里,我对Java / Clojure / Python感兴趣,但是答案不需要特定于语言。 是否有任何新兴技术可以验证注释并自动检测“模糊”注释(例如,带有魔术数字的注释,不完整的句子等)或不正确的注释(例如,检测拼写错误的变量等)。 更重要的是:那里是否存在公认的“评论政策”或策略?那里有很多关于如何编码的建议-但是“如何发表评论”呢?

4
“使用地图代替类来表示数据” -Rich Hickey
在Clojure创作者Rich Hickey的这段视频中,他建议使用map来表示数据,而不是像Java那样使用类来表示数据。我不明白该怎么做,因为如果API用户将其简单地表示为地图,他们怎么会知道输入键是什么。 范例: PersonAPI { Person addPerson(Person obj); Map<String, Object> addPerson(Map<String, Object> personMap); } 在第二个函数中,API用户如何知道创建人的输入是什么?
19 java  design  class  clojure  map 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.