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

Scala – Lisp是REPL的唯一语言吗?

发布时间:2020-12-16 09:33:57 所属栏目:安全 来源:网络整理
导读:除了Lisp(ruby,scala)之外,还有其他语言使用REPL(Read,Eval,Print,Loop),但是不清楚REPL是什么意思与Lisp相同。 Lisp REPL与非Lisp REPL有何不同? 解决方法 REPL的想法来自Lisp社区。还有其他形式的文本交互界面,例如命令行界面。一些文本界面还允许
除了Lisp(ruby,scala)之外,还有其他语言使用REPL(Read,Eval,Print,Loop),但是不清楚REPL是什么意思与Lisp相同。 Lisp REPL与非Lisp REPL有何不同?

解决方法

REPL的想法来自Lisp社区。还有其他形式的文本交互界面,例如命令行界面。一些文本界面还允许执行某种编程语言的子集。

REPL代表READ EVAL PRINT LOOP:(loop(print(eval(read))))。

在Lisp中,REPL不是命令行解释器(CLI)。 READ不读命令,REPL不执行命令。 READ读取输入并将其转换为数据。因此,READ函数可以读取各种s表达式,而不仅仅是Lisp代码。

READ读取s表达式。这是一种数据格式,也支持编码源代码。 READ返回Lisp数据。

EVAL以Lisp数据的形式使用Lisp源代码并对其进行评估。副作用可能发生,EVAL返回一个或多个值。如何使用解释器或编译器实现EVAL,未定义。实施使用不同的策略。

PRINT将Lisp数据打印为s表达式。

LOOP只是围绕着这个循环。在现实生活中,REPL更复杂,包括错误处理和子循环,所谓的断点循环。在错误的情况下,在错误的上下文中,只有另一个REPL,添加了调试命令。在一次迭代中产生的值也可以重新用作下一次评估的输入。

由于Lisp既使用代码数据和功能元素,与其他编程语言也有一些差异。

类似的语言也提供了类似的交互界面。例如Smalltalk也允许交互式执行,但是它不会像Lisp那样使用I / O的数据格式。任何Ruby / Python / …交互式界面都相同。

那么阅读EXPRESSIONS的原始想法有多重要,对它们进行评估和打印他们的价值观?对于其他语言来说,重要的是:阅读文本,解析它,执行它,打印某些东西,并可选择打印返回值。通常返回值没有被真正使用。

所以有两个可能的答案:

> Lisp REPL与大多数其他文本交互界面不同,因为它基于s表达式的数据I / O的概念并对其进行评估。
> REPL是描述文本交互界面的通用术语,用于编程语言实现或其中的子集。

在实际实现中,Lisp REPL具有复杂的实现,并提供大量的服务,最多可以输入和输出对象的可点击演示(Symbolics,CLIM,SLIME)。高级REPL实现例如可用于SLIME(通用的基于Emacs的Common Lisp IDE),LispWorks和Allegro CL。

Lisp REPL的示例:

产品和价格表:

CL-USER 1 > (setf *products* '((shoe (100 euro))
                               (shirt (20 euro))
                               (cap (10 euro))))
((SHOE (100 EURO)) (SHIRT (20 EURO)) (CAP (10 EURO)))

订单,产品和数量清单:

CL-USER 2 > '((3 shoe) (4 cap))
((3 SHOE) (4 CAP))

订单的价格*是包含最后REPL值的变量。它不包含该值作为字符串,而是实际的实际数据。

CL-USER 3 > (loop for (n product) in *
                  sum (* n (first (second (find product *products*
                                                :key 'first)))))
340

但您也可以计算Lisp代码:

我们来看一个函数,它加上它的两个args的平方:

CL-USER 4 > '(defun foo (a b) (+ (* a a) (* b b))) 
(DEFUN FOO (A B) (+ (* A A) (* B B)))

第四个元素只是算术表达式。 *指最后一个值:

CL-USER 5 > (fourth *)
(+ (* A A) (* B B))

现在我们添加一些代码来将变量a和b绑定到一些数字。我们正在使用Lisp函数LIST来创建一个新的列表。

CL-USER 6 > (list 'let '((a 12) (b 10)) *)
(LET ((A 12) (B 10)) (+ (* A A) (* B B)))

然后我们评估上述表达式。再次,*指最后一个值。

CL-USER 7 > (eval *)
244

每个REPL交互都会更新几个变量。以前的值是*,**和***。还有以前的输入。这些变量的值不是字符串,而是数据对象。将包含REPL的读取操作的最后一个结果。例:

变量* print-length *的值是多少?

CL-USER 8 > *print-length*
NIL

看看列表如何读取和打印:

CL-USER 9 > '(1 2 3 4 5)
(1 2 3 4 5)

现在我们将上面的符号* print-length *设置为3.将第二个上一个输入读取为数据。 SET设置一个符号值。

CL-USER 10 > (set ++ 3)
3

然后上面的列表打印不同。 **是指第二个以前的结果 – 数据,而不是文本。

CL-USER 11 > **
(1 2 3 ...)

(编辑:李大同)

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

    推荐文章
      热点阅读