scala - Scala REPL 和 Clojure REPL 的区别——编译速度

标签 scala clojure read-eval-print-loop

我尝试使用相同的算法运行两个阶乘函数,一个在 Scala 中,另一个在 Clojure 中:

// Scala:
def factorial(n:Int) = (1 to n).foldLeft(1: BigInt)(_*_)

——
;; Clojure:
(defn factorial [x]
  (reduce * (range 1N (inc x))))

我第一次将函数输入到 REPL 中时,Clojure 的计算(函数定义,而不是计算阶乘)没有任何明显的延迟;而 scala 只是暂停了一小段时间。 (虽然非常非常短,但仍然引人注目。)

当我应用该函数来计算阶乘时,两者都非常快地返回结果。

我想对 REPL 有一个基本的了解。两个REPL有什么区别吗? Scala REPL 是真正的 REPL 吗?

最佳答案

REPL 具有相当特定的含义。 “真正的 REPL”将符合以下模式:读取评估打印循环。只需几行就可以在 clojure 中构建一个 REPL:

(loop []
  (let [string (read-line)
        data (read-string line)
        result (eval data)]
    (println result)
    (recur)))

在这里您可以看到真正的 repl 的主要部分。 read-line从控制台读取一些文本。 read-string将该字符串转换为数据(列表、向量、数字等)。 eval计算返回结果的数据,和 println打印结果。

有些人会争辩说(我也同意)只有那些遵循这四个步骤的系统才有资格被称为 repl。有些人还会指出 Scala 不是 homoiconic,因此不能真正拥有 repl。

我所说的同像,我的意思是编译器对由语言的读者产生并由语言的核心结构操纵的相同数据结构进行操作。例如,这是完全有效的 Clojure 代码:
 (eval (list (symbol "+") 41 1))) ; evals to 42

所以这就是关于“真实”REPL 的争论的要点。只有像 lisp(也许还有 prolog?)这样的同音语言才能拥有真正的 REPL。所有其他人都应该真正命名为“交互式解释器”。

就速度而言。这可能是由于编译器的复杂性。 Clojure 编译器只有大约 10k 行非常线性的代码。单程,没什么特别的。 Scala 编译器非常先进,支持静态类型和多次传递等功能。像 Clojure 这样的语言不需要这些额外的功能,而且它们确实会降低编译器的速度。

关于scala - Scala REPL 和 Clojure REPL 的区别——编译速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30387801/

相关文章:

Scala:如何使用隐式参数定义匿名函数?

scala - 如何从 Play 中的每个请求记录正文?

Scala导入多个包

haskell - 采用函数式语言的 Kernighan & Ritchie 字数统计示例程序

python - 模拟 Python shell 的 "return value"行为

scala - 高级类型成员声明之间的区别

clojure - Clojure 中简单的快速排序

java - 调试在 java 代码中调用的 clojure 函数(eclipse)

swift - 如何在 Swift REPL 的代码片段中插入换行符

node.js - Meteor 有 REPL 吗?