Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamic Clojure是单打的吗?_Dynamic_Types_Clojure_Static Language - Fatal编程技术网

Dynamic Clojure是单打的吗?

Dynamic Clojure是单打的吗?,dynamic,types,clojure,static-language,Dynamic,Types,Clojure,Static Language,他写了一篇引人入胜的文章叫做。他在信中写道: 而这正是动态类型语言的错误所在:它们没有提供忽略类型的自由,而是将注意力限制在单一类型上!每个值都必须是该类型的值,您别无选择 这个。(单一类型的语言) 现在Clojure: Clojure是一种面向Java虚拟机(以及CLR和JavaScript)的动态编程语言。它被设计成一种通用语言,将脚本语言的可接近性和交互式开发与高效、健壮的多线程编程基础结构相结合。Clojure是一种编译语言,它直接编译到JVM字节码,但仍然保持完全动态。Clojure支

他写了一篇引人入胜的文章叫做。他在信中写道:

而这正是动态类型语言的错误所在:它们没有提供忽略类型的自由,而是将注意力限制在单一类型上!每个值都必须是该类型的值,您别无选择

这个。(单一类型的语言)

现在Clojure:

Clojure是一种面向Java虚拟机(以及CLR和JavaScript)的动态编程语言。它被设计成一种通用语言,将脚本语言的可接近性和交互式开发与高效、健壮的多线程编程基础结构相结合。Clojure是一种编译语言,它直接编译到JVM字节码,但仍然保持完全动态。Clojure支持的每个功能在运行时都受支持

“动态”的意思是“可以在运行时与之交互”,而不是“没有类型”

现在,静态和动态之间的关键区别似乎是“我能在编译时得到类型失败吗?”

如果我编写以下Clojure代码:

(deftype circle-type [radius] )

(deftype square-type [side-length])


(defn def-check-type [new-symbol-type existing-symbol]
 (let [existing-symbol-type (type existing-symbol)]
    (cond 
     (= new-symbol-type existing-symbol-type) 
     (def new-symbol existing-symbol)
     :else (str "types didn't match: " new-symbol-type " : " existing-symbol-type))))

(println (def-check-type circle-type (square-type. 2)));)
然后在Leiningen中编译:

lein uberjar
然后我得到以下结果:

$ lein uberjar
Compiling clojure-unittyped.core
types didn't match: class clojure_unittyped.core.circle-type : class clojure_unittyped.core.square-type
在动态语言中,这似乎是编译时的类型失败

我的问题是:Clojure是单打的吗?



编辑-我知道-这是一项出色的工作。我问的问题与此无关

我读了。我不明白。但是,正如作者罗伯特·哈珀猜测的那样,我没有去卡内基梅隆大学。我们似乎有一大堆针对稻草人的尖刻言辞,最后得出了一个惊人的结论:动态类型语言就是动态类型语言

这里的主要混淆是“动态编程语言”和“动态类型化”这两个术语之间的混淆。这不是一回事。例如,动态编程语言可以有一个健壮的静态类型系统,尽管大多数没有。哈珀通过混合术语使这种混乱永久化

动态语言 您引用的Clojure描述是关于Clojure是一种“动态编程语言”

Clojure支持的每个功能在运行时都受支持

关键是Clojure的全部功能在运行时可用。您可以在运行时动态地添加新代码、添加新类型、将协议扩展到现有类型等

这是值得夸耀的

所以,当哈珀讽刺地问,“那么,嘿,动态语言很酷,对吧?”我真诚地回答,“是的,先生,它们很酷,但显然我们谈论的不是同一件事!”

动态类型 动态类型与静态类型是另一个问题。Clojure并没有吹嘘没有一个健壮的类型系统。大多数Clojuris人都会欢迎这一选择,因此对这一选择感兴趣。例如,Haskell的类型系统有很多值得一提的地方。没有人真正挑战这一点

你的榜样 在您的示例中,您正在使用编译时模糊运行时(使用动态语言,编译器的全部功能在运行时可用时,编译时已经模糊)。执行的类型检查发生在
println
语句的运行时。在Clojure中,值具有类型,而引用类型(例如使用
def
创建的
var
)的存储位置不具有类型

你的问题 为了回答您的标题问题,Clojure被归入动态键入的标题下。如果您真的愿意,您可以调用动态类型的“uni-typed”;但是,至少在那篇文章的上下文中,这个词似乎被用作贬义词。只要称之为动态类型,我们就知道这意味着什么


不过,更大的问题是,如果您关注的是动态类型与静态类型,那么您就错过了Clojure作为一种动态编程语言的,是的,非常酷的一点。像core.typed这样的项目最终将提供输入。酷的部分将保留。

是的,Clojure是单类型的,但是Sam Tobin Hochstadt单类型分类在实践中信息量不大

单类型理论很少揭示动态类型语言编程的本质;它主要用于证明类型理论中“动态”类型的存在


像这样的项目的发明正是为了发现和建模程序员在这些语言中使用的隐式类型信息。通常情况下,类型非常准确,并且显示出比表面上看到的要多得多。

我认为你不会发现这种“单一类型”的想法被广泛使用。他(Robert Harper)似乎用它来编码他的担忧,尽管我找不到这种“单类型”分类的广泛使用或支持。除了这里的其他评论外,值得注意的是,动态类型与静态类型并不是真正的布尔属性。C通常被认为是静态类型的,这是有充分理由的,但是使用指针可以很容易地愚弄编译器。(我想说动态/静态类型是程度的问题,但这只是一种粗略的说法。)因此,通过或失败一个测试并不一定足以将一种语言划分为一种或另一种。运行时if-then-else以任何方式比较运行时类型为条件,如何在编译时显示为类型失败?可以解释的是,通常称为动态类型编程语言的是“后期绑定”编程语言-它只计算在最后一刻,在运行时,在实际需要调用函数之前,它实际上需要为给定函数调用找到什么代码。另一方面,像Haskell这样的早期绑定语言在编译阶段已经解决了所有这些问题。这些不一定是静态/动态类型的替代术语,但可以帮助(如果没有其他突出显示没有简单的区别的话)