什么是Clojure的好展示?

什么是Clojure的好展示?,clojure,Clojure,我想开一个关于Clojure的会议。您能推荐一个使用Clojure函数式编程可以优雅地解决的问题吗?您能指出涵盖此主题的资源吗 经典的并发问题“睡眠理发师”可能是个好问题 这里有几个例子 使用Clojure的许多论据似乎与它对并发性的处理有关,但我在这里不涉及这个问题 我将列出一些我每周都不得不用Java处理的问题,以及我如何在Clojure中解决这些问题 不变性 在Java中,实现不变性非常困难。除了遵循严格的编码实践之外,您还必须非常仔细地选择框架和库。另外,作为一个副作用,您要么编写大量

我想开一个关于Clojure的会议。您能推荐一个使用Clojure函数式编程可以优雅地解决的问题吗?您能指出涵盖此主题的资源吗

经典的并发问题“睡眠理发师”可能是个好问题

这里有几个例子


使用Clojure的许多论据似乎与它对并发性的处理有关,但我在这里不涉及这个问题

我将列出一些我每周都不得不用Java处理的问题,以及我如何在Clojure中解决这些问题

不变性

在Java中,实现不变性非常困难。除了遵循严格的编码实践之外,您还必须非常仔细地选择框架和库。另外,作为一个副作用,您要么编写大量代码来创建一个干净、可用的API,要么强制客户机处理它

final Person person = personDao.getById(id);
// I would like to "change" the person's email, but no setters... :(
在Clojure中,您基于不可变的数据结构对数据进行建模,因此默认情况下所有对象都是不可变的,因此Clojure提供了对这些结构进行操作的强大功能

(let [person            (get-by-id person-dao id)
      person-with-email (assoc person :email email)]
  ; Use person-with-email...
转换

在Java中,您有一个域类
Person
,其中包含
id
name
email
socialSecurityNumber
等字段。您正在创建一个web服务,用于检索数据库中所有人员的姓名和电子邮件。您不想公开您的域,因此创建了一个类
PersonDto
,其中包含
name
email
。这很简单,因此现在需要一个函数将数据从
Person
映射到
PersonDto
。可能是这样的:

public class PersonPopulator {
    public PersonDto toPersonDto(Person person) {
        return new PersonDto(person.getName(), person.getEmail());
    }

    public List<PersonDto> toPersonDtos(List<Person> persons) {
        List<PersonDto> personDtos = new ArrayList<PersonDto>();
        for (Person person : persons) {
            personDtos.add(toPersonDto(person));
        }
        return personDtos;
    }
}
以及操纵人员名单:

(map #(person-with-fields % :name :email) persons)
向个人添加临时数据也很容易:

(assoc person :tweets tweets)
这不会破坏任何东西。在Java中,如果您的对象是不可变的,那么它们可能没有setter,因此您必须编写大量样板文件来修改一个字段(
newperson(oldPerson.getName()、oldPerson.getEmail()、tweets
),或者创建一个全新的类。可变对象提供了一个很好的API(
oldPerson.setTweets(tweets)
),但很难测试和理解

测试

很多Java代码都是基于某种状态的,即使不需要它。这意味着您可以模拟这种状态,这通常意味着额外的样板文件,如果您在创建代码时没有考虑到可测试性,则会变得更加困难。另一方面,没有mock的测试通常很慢,并且依赖于数据库访问或时间,或者其他一些有时肯定会失败的东西

在编写Clojure时,我注意到我实际上并不需要太多的状态。几乎唯一的情况是当我从“外部”检索东西时,无论是数据库还是web服务

摘要


我的代码是一个管道,从一端我得到一些数据,这些数据在管道中通过过滤、转换或与其他数据连接而改变,直到到达管道的末端。在管道内部,不需要真正更改数据,但在很多情况下,强大的函数和不可变的数据结构都是有用的,这就是为什么Clojure能用这样的代码创造奇迹。

几个月前,我遇到了同样的问题,我们决定在Clojure中解决“蒙娜丽莎”问题。结果是。基本上,我们展示了Clojure在解决“代码作为数据”提供了优雅解决方案的问题方面是非常酷的。例如在遗传算法中。

什么类型的会话?你在寻找一个可以在一小时、一天、一周内解释的问题和解决方案吗?有很多可能性。我们在公司范围内定期举办展示活动,展示新技术。这是一个2小时的实践环节,我喜欢这个总结。这正是我在Clojure工作三个月时的感受。
(assoc person :tweets tweets)