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

Class 关于Clojure中列表和其他内容的问题,class,list,parameters,clojure,Class,List,Parameters,Clojure,我有一些关于clojure中的列表、类和变量的问题 这可能看起来很愚蠢,但如何访问列表中的元素 我正在编写一个程序,允许你操作电话簿;您可以添加条目、删除条目或打印有关条目的信息。这就引出了两个问题: 有没有办法创建一个包含“name”、“address”和“phone number”变量的类“entry”?或者这在clojure(以及一般的函数式编程)中是不可能的,如果我不能有一个包含这些信息的对象列表,我将如何执行这项任务 我想用一个函数来读取用户输入,了解用户想要做什么(添加条目、删除条目

我有一些关于clojure中的列表、类和变量的问题

  • 这可能看起来很愚蠢,但如何访问列表中的元素
  • 我正在编写一个程序,允许你操作电话簿;您可以添加条目、删除条目或打印有关条目的信息。这就引出了两个问题:

  • 有没有办法创建一个包含“name”、“address”和“phone number”变量的类“entry”?或者这在clojure(以及一般的函数式编程)中是不可能的,如果我不能有一个包含这些信息的对象列表,我将如何执行这项任务

  • 我想用一个函数来读取用户输入,了解用户想要做什么(添加条目、删除条目或打印信息),然后调用相应的函数来做这件事,当第一个函数完成时会调用它。将条目列表作为参数传递给每个函数是否正确


  • 你考虑过买这本书吗?pdf版本只需21美元。在我看来,这钱是物有所值的

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

    例如:

    (nth [1 2 3 4] 2) ; -> 3 (since it uses zero-based indexing)
    
    有没有办法创建一个包含“name”、“address”和“phone number”变量的类“entry”?或者这在clojure(以及一般的函数式编程)中是不可能的,如果我不能有一个包含这些信息的对象列表,我将如何执行这项任务

    这在Clojure是可能的,但不符合传统。在Clojure中,数据实体的基本抽象是映射,而不是类(除了一些需要与Java框架直接互操作的特殊情况)。因此,您只需使用地图:

    (def entry {:name "x" :address "y" :phone-number "z"})
    
    要访问项目的名称,可以使用

    (:name entry)
    
    (:name entry)
    

    前者仅在地图的键为关键字时有效,后者适用于所有类型的键

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

    我想用一个函数来读取用户输入,了解用户想要做什么(添加条目、删除条目或打印信息),然后调用相应的函数来做这件事,当第一个函数完成时会调用它。将条目列表作为参数传递给每个函数是否正确

    由于您的模型只包含一个主数据结构(电话簿序列),因此将其作为arg传递无疑是设计功能的合适方法。如果您希望有更多种类的顶级容器(例如,对于更真实的应用程序),我建议您研究一下,它一开始看起来有点吓人(至少对我来说是这样,它包含了很多Clojure特有的术语),但是非常值得学习

    (entry :name)
    
    在访问地图时也会起作用。因此,使用关键字访问地图元素有三种方式:

    (entry :name)
    

    在哪里

    正如Rayne提到的,只有当关键字是关键字时,第二种形式才可能出现。您可以将其他“短”形式与其他类型的键一起使用:

    user=>(def my-map {"a" "b" "c" "d"})
    user=>(my-map "c")
    "d"
    user=>(get my-map "a")
    "b"
    

    对于你的问题的第一部分,如果你将访问列表中的项目(NTH…),你可以考虑使用向量。向量不像其他语言中的数组。例如,除了数字索引外,切碎它们和在末尾添加新元素也是有效的。在引擎盖下,阵列实际上与地图非常相似

    最好的数组是索引的函数:

    (def a [1 2 3 4]) (a 2) ==> 3 (定义a[1 2 3 4]) (a2)=>3
    对于第2部分和第3部分,pmf的回答很好地涵盖了它们

    我支持这一点,尤其是没有FP经验。我支持这一点。现在就看这本书。优秀的资源。如果你没有函数式编程的经验,我强烈建议你购买programming Clojure,因为它将帮助你完成所有这些。在此之前,我建议通读以下内容:我认为结构比地图更适合他的用途。非常感谢,非常有用的信息
    (get entry :name)
    
    (def entry {:name "x" :address "y" :phone-number "z"})
    
    user=>(def my-map {"a" "b" "c" "d"})
    user=>(my-map "c")
    "d"
    user=>(get my-map "a")
    "b"
    
    (def a [1 2 3 4]) (a 2) ==> 3