Scala REPL和Clojure REPL之间的区别 - 编译速度

Nic*_*ick 5 scala clojure read-eval-print-loop

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

// Scala:
def factorial(n:Int) = (1 to n).foldLeft(1: BigInt)(_*_)
Run Code Online (Sandbox Code Playgroud)

-

;; Clojure:
(defn factorial [x]
  (reduce * (range 1N (inc x))))
Run Code Online (Sandbox Code Playgroud)

第一次将函数输入REPL时,Clojure评估(函数定义,不计算阶乘),没有任何明显的延迟; 而scala只是暂停了一会儿.(虽然很短很短,但仍然很明显.)

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

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

Tim*_*dge 10

REPL具有相当具体的含义."True REPL"将符合以下模式:Read Eval Print Loop.只需几行就可以在clojure中构建一个REPL:

(loop []
  (let [string (read-line)
        data (read-string line)
        result (eval data)]
    (println result)
    (recur)))
Run Code Online (Sandbox Code Playgroud)

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

有些人会争辩(我会同意)只有那些遵循这四个步骤的系统才有资格被称为repl.还有一些人还会指出Scala不是同性恋,所以不能真正有一个repl.

通过homoiconic,我的意思是编译器在语言读者生成的相同数据结构上运行,并且由语言的核心结构操纵.例如,这是完全有效的Clojure代码:

 (eval (list (symbol "+") 41 1))) ; evals to 42
Run Code Online (Sandbox Code Playgroud)

这就是关于"真实"REPL的辩论的要点.只有像lisp(也许是prolog?)这样的homoiconic语言可以拥有真正的REPL.所有其他人应该真正被命名为"互动口译员".

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