加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:41:39 所属栏目:安全 来源:网络整理
导读:我尝试使用相同的算法运行两个阶乘函数,一个在 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中,另一个在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具有相当具体的含义. “True REPL”将符合以下模式:Read Eval Print Loop.只需几行就可以在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不是同性恋,所以不能真正有一个repl.

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

(eval (list (symbol "+") 41 1))) ; evals to 42

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读