如果我们将“静态类型”和“动态类型”这些短语视为术语,指的是语言在检查操作是否有效时检查类型的时间,那么我认为可以用术语“未经类型检查”的方式来描述Mathematica——因为它“从不”检查操作是否适用于某种类型。
然而,我喜欢Belisarius使用“类型不可知”的术语。我之所以这么说,是因为虽然语言中几乎所有的类型检查都是惯用的(即由程序员实现,而不是语言实现),但应用运算符到有类型操作数的概念也是惯用的!
考虑“无意义”的例子
1 + "foo"
。我认为可以公正地说,在学习该语言时,几乎所有Mathematica用户都会遇到此类情况。当以C语言的风格编写代码时,问题尤为明显。在Mathematica圈子里,如何处理这种情况是一个广泛讨论的话题。
另一方面,这种弱点也是Mathematica的最大优势。Mathematica针对创建新符号进行了优化。许多符号具有与小学算术中的加法非常相似的
+
概念。在构建这样的符号时,如果Mathematica插手并抱怨
+
的操作数不是数字,那将非常不方便。在这样更高级的Mathematica应用程序中,“荒谬”的例子不仅是“有意义的”,而且实际上是至关重要的。
因此,考虑到这一点,类型问题经常是无关紧要的。因此,我喜欢
Belisarius的“类型不可知”表述。我赞成他的观点;)
编辑
我将尝试澄清我在区分“无类型”和“类型不可知”时所想的内容。
阅读各种答案和评论后,我试图弄清楚Mathematica和LISP之间的区别。后者通常被视为“动态类型”的示例,尽管核心LISP求值器非常像Mathematica,几乎没有任何类型检查。我们在LISP程序中看到的类型错误大多是由(通常是内置的)函数中的硬编码检查发出的。例如,
+
将仅接受数字参数,即使求值器本身无论如何都不关心。话虽如此,用LISP编程的“感觉”与用Mathematica编程的“感觉”大相径庭(至少对我来说是这样)。
1 +“foo”
的例子真正捕捉了这种差异。
虽然我大体上同意将Mathematica描述为“未类型化”,但我仍感觉缺少某些东西。对我来说,汇编语言是未类型化的,早期的FORTRAN和ANSI C也是如此。在这些情况下,参数的位模式是唯一重要的,如果我传递一个字符串参数而需要整数,则程序将继续执行。Mathematica当然也共享了这种未类型化的行为。但有一个区别:在汇编语言、FORTRAN和C中,缺乏类型检查很少会带来好结果。正如我上面提到的,在Mathematica中,依赖这种行为有时甚至很常见。
进入“类型不可知”。我喜欢它不偏不倚的态度,听起来比“未类型化”更不激烈。我感觉它反映了Mathematica本质上未类型化的特性,但留给那些支持LISP动态风格中惯用的类型检查(即“head”惯用法和支持功能)的语言特性一些余地。
因此,简而言之,我认为Mathematica在完全未类型化和动态类型之间徘徊。“类型不可知”对我来说捕捉了这种情感。你的看法可能不同 :)
我坦率地承认,仅从“untyped”和“type-agnostic”这两个短语来检查我的回答,没有人可能重构出任何东西。再次强调,我认为“untyped”是对Mathematica的公正描述,但我也喜欢“type-agnostic”的事实,因为它引发了各种回应这个SO问题的问题。
1 + "foo"
是无意义的?顺便说一下,在 Mathematica 中,“无意义”并不总是被计算,因此它的含义比较弱,只是表示“没有相应的规则”。 - gwr