相关疑难解决方法(0)

哪些语言是动态类型和编译的(哪些是静态类型和解释的)?

在我对动态和静态类型的阅读中,我不断反对编译静态类型语言的假设,同时解释动态类型语言.我知道一般来说这是真的,但我对异常感兴趣.

我真的希望有人不仅可以提供这些例外的一些例子,而是试图解释为什么决定这些语言应该以这种方式工作.

type-systems programming-languages static-typing dynamic-typing

37
推荐指数
1
解决办法
5721
查看次数

Lisp如何既动态又编译?

好的,首先要解决这个问题:我已经阅读了以下答案:

Lisp是如何动态编译的?

但我真的不明白它的答案.

在像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

经过大量研究(即狂热的维基百科浏览),我想我理解以下内容:

  • 动态类型语言是在运行时检查类型的语言
  • 静态类型语言是在编译程序时检查类型的语言
  • 类型声明允许编译器使代码更有效,因为它不是一直进行API调用而是可以使用更多的本机"函数"(这就是为什么你可以为Cython代码添加类型声明来加速它,但是没有to,因为它仍然只能在C代码中调用Python库)
  • Lisp中没有数据类型; 因此没有要检查的类型(类型是数据本身)
  • Obj-C有静态和动态声明; 前者在编译时进行类型检查,后者在运行时进行

如果我在上述任何一点上错了,请纠正我.

lisp compiler-construction static-typing dynamic-typing

10
推荐指数
2
解决办法
980
查看次数

LISP 是编译型语言还是解释型语言?

我知道严格来说不存在编译或解释语言这样的东西。

但是,一般来说,LISP 是用来编写像 Python、bash 脚本、批处理脚本这样的脚本吗?

或者它是像 C++、JAVA 和 C# 这样的通用编程语言吗?

谁能用简单的术语解释一下?

lisp

4
推荐指数
1
解决办法
1万
查看次数

声明检查类型之间的 Common Lisp 区别

有人可以解释以下两种情况之间的区别吗(如果对我来说无法理解的话,特别是评论所说的内容)来自 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)

common-lisp declare

3
推荐指数
1
解决办法
601
查看次数

GNU CLISP中的堆栈溢出(&不在SBCL中)

我在以下代码中出现堆栈溢出,然后在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)

clisp common-lisp

1
推荐指数
1
解决办法
57
查看次数