2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面获取更多关于这个网站如何运作的信息。

+1
Clojure

可能是一个简单的问题,但我是 Clojure 新手,无法解决这个问题。

为什么这不会求值并引发错误
clojure.lang.ExceptionInfo:无法解析符号:defstruct

(ns StructMaps)

(defn Pets
  []
  (defstruct pets :PetType :PetName)
  (def myPet (struct pets "dog" "Fido"))
  (println myPets)
  )

(Pets)

感谢有用的回答!

我想知道为什么人们还在使用 defstruct,而已经有了 defrecord?我很想知道是什么让您选择了这个选项。
我猜:问题操作员遵循了 TutorialsPoint Clojure 教程,如 https://www.tutorialspoint.com/clojure/clojure_struct.htm,或者是 2023 年的 Udemy Clojure:The Complete Beginner's Guide https://www.udemy.com/course/clojureprogramming/ ... 这两个都是非常糟糕的。
也许这也值得关注

驼峰命名法在Clojure中表示绑定时并不常用,所以我们会有(ns struct-maps)、(defn pets ...)、(def my-pet ...)等等。我们确实会在类似“类型”名称或底层生成Java类的情况下使用驼峰命名法。

def(以及其他def*相关函数)创建顶级定义,所以我们通常不在函数内部使用它们。如果你在跟随一个这样做的教程,那么这是一个糟糕的教程,你应该停止跟随它并寻找更好的教程。

正如其他人所指出的,结构体(structs)已经废弃很长时间了,即使有现代替代品record存在,我们通常也使用普通的哈希表 —— 这是从静态类型OOP语言转换过来时你必须习惯的事情:Clojure大部分时间都关注简单数据。

1 个答案

0
by

当用clj -M StructMaps.clj运行时,我无法重现这个问题,除了有一个拼写错误:myPet可能应该是myPets

...