关于Clojure中的列表和其他内容的问题

JoO*_*oOb 3 parameters class list clojure

关于clojure中的列表,类和变量,我有几个问题.

  1. 这可能看起来很愚蠢,但如何访问List中的元素?

我正在编写一个允许你操作电话簿的程序; 您可以添加条目,删除条目或打印有关条目的信息.这引出了两个问题:

  1. 有没有办法创建一个包含"名称""地址""电话号码"变量的类"条目"?或者在clojure中是不可能的(通常是函数式编程?)如果我不能拥有包含该信息的对象列表,我将如何进行此任务?

  2. 我正在考虑使用一个函数来读取用户输入以了解用户想要做什么(添加条目,删除条目或打印信息)然后调用相应的函数来执行该操作,该函数在完成后回调第一个函数.作为参数传递每个函数的条目列表是正确的事情吗?

pmf*_*pmf 7

这可能看起来很愚蠢,但如何访问List中的元素?

(nth coll index)
Run Code Online (Sandbox Code Playgroud)

例如:

(nth [1 2 3 4] 2) ; -> 3 (since it uses zero-based indexing)
Run Code Online (Sandbox Code Playgroud)

有没有办法创建一个包含"名称""地址""电话号码"变量的类"条目"?或者在clojure中是不可能的(通常是函数式编程?)如果我不能拥有包含该信息的对象列表,我将如何进行此任务?

这在Clojure中是可能的,但却是单一的.在Clojure中,数据实体的基本抽象是映射,而不是类(除了需要与Java框架直接互操作的一些极端情况).所以你只需要使用一张地图:

(def entry {:name "x" :address "y" :phone-number "z"})
Run Code Online (Sandbox Code Playgroud)

要访问该项目的名称,您可以使用

(:name entry)
Run Code Online (Sandbox Code Playgroud)

要么

(get entry :name)
Run Code Online (Sandbox Code Playgroud)

前者仅在地图的关键字是关键字时起作用,后者适用于所有类型的关键字.

因此,对于您的示例,您的数据模型(电话簿)将是此类地图的seq(例如,列表或向量).

我正在考虑使用一个函数来读取用户输入以了解用户想要做什么(添加条目,删除条目或打印信息)然后调用相应的函数来执行该操作,该函数在完成后回调第一个函数.作为参数传递每个函数的条目列表是正确的事情吗?

由于您的模型只包含一个主要数据结构(电话簿序列),因此将其作为arg传递肯定是设计函数的合适方法.如果您希望有更多种类的顶级容器(即更真实的应用程序),我建议您查看应用程序上下文模式,它最初看起来有点令人生畏(至少它对我来说是这样,并且它包含很多特定的Clojure行话,但值得努力学习.

  • 我认为某种结构比地图更好地适合他的目的。 (2认同)

Tod*_*out 5

你有没有考虑过购买Programming Clojure这本书?pdf版只需21美元.在我看来,这物有所值.