在我对动态和静态类型的阅读中,我不断反对编译静态类型语言的假设,同时解释动态类型语言.我知道一般来说这是真的,但我对异常感兴趣.
我真的希望有人不仅可以提供这些例外的一些例子,而是试图解释为什么决定这些语言应该以这种方式工作.
type-systems programming-languages static-typing dynamic-typing
好的,首先要解决这个问题:我已经阅读了以下答案:
但我真的不明白它的答案.
在像Python这样的语言中,表达式为:
x = a + b
Run Code Online (Sandbox Code Playgroud)
无法真正编译,因为"编译器"不可能知道a和b的类型(因为类型只在运行时知道),因此如何添加它们.
这就是使Python这样的语言在没有类型声明的情况下无法编译的原因,对吗?通过声明,编译器知道例如a和b是整数,因此知道如何添加它们,并将其转换为本机代码.
那怎么做:
(setq x 60)
(setq y 40)
(+ x y)
Run Code Online (Sandbox Code Playgroud)
工作?
编译被定义为本机提前编译.
编辑
实际上,这个问题更多的是关于是否可以编译没有类型声明的动态语言,如果是,如何编译?
编辑2
经过大量研究(即狂热的维基百科浏览),我想我理解以下内容:
如果我在上述任何一点上错了,请纠正我.
我知道严格来说不存在编译或解释语言这样的东西。
但是,一般来说,LISP 是用来编写像 Python、bash 脚本、批处理脚本这样的脚本吗?
或者它是像 C++、JAVA 和 C# 这样的通用编程语言吗?
谁能用简单的术语解释一下?
有人可以解释以下两种情况之间的区别吗(如果对我来说无法理解的话,特别是评论所说的内容)来自 CLHS 的功能:
;; This function assumes its callers have checked the types of the
;; arguments, and authorizes the compiler to build in that assumption.
(defun discriminant (a b c)
(declare (number a b c))
"Compute the discriminant for a quadratic equation."
(- (* b b) (* 4 a c))) => DISCRIMINANT
(discriminant 1 2/3 -2) => 76/9
;; This function assumes its callers have not checked the types of the
;; arguments, and performs explicit type …Run Code Online (Sandbox Code Playgroud) 我在以下代码中出现堆栈溢出,然后在SBCL中尝试了一下并成功了。想知道是什么造成了那里的差异。
特别是:虽然我确实计划在某个时候移至SBCL,但可以在CLISP中使用它吗?
(defvar *objs* nil) ; [1]
(defun parents (obj) (gethash :parents obj))
(defun obj (&rest parents) ; [2]
(let ((obj (make-hash-table)))
(push obj *objs*)
(setf (parents obj) parents)
obj))
(defun (setf parents) (val obj) ; [3]
(prog1 (setf (gethash :parents obj) val)
(make-precedence obj)))
(defun make-precedence (obj) ; [4]
(setf (gethash :preclist obj) (precedence obj))
(dolist (x *objs*)
(if (member obj (gethash :preclist x))
(setf (gethash :preclist x) (precedence x)))))
(defun precedence (obj) ; [5]
(delete-duplicates (traverse obj)))
(defun …Run Code Online (Sandbox Code Playgroud)