文档章节

REPL (read-evaluate-print-loop)概念-读取评估打印循环

张宏亮1982
 张宏亮1982
发布于 2016/12/11 12:04
字数 1565
阅读 46
收藏 1
点赞 0
评论 0
  • 概述

在REPL中,用户输入一个或多个表达式(而不是整个编译单元),REPL评估它们并显示结果。名称read-eval-print循环来自实现此功能的Lisp原语函数的名称:

读取函数接受来自用户的表达式,并将其解析为存储器中的数据结构。例如,用户可以输入s表达式(+ 1 2 3),其被解析为包含四个数据元素的链表。
eval函数接受这个内部数据结构并对其进行计算。在Lisp中,以函数名称开始的s表达式的计算意味着对构成表达式其余部分的参数调用该函数。因此,对参数1 2 3调用函数+,得到结果6。
打印函数接收eval生成的结果,并将其打印给用户。如果它是一个复杂的表达式,它可以是漂亮的打印,使其更容易理解。在这个例子中,虽然,数字6不需要太多的格式打印。
然后开发环境返回到读状态,创建一个循环,当程序关闭时,循环终止。

REPL有助于探索性编程和调试,因为程序员可以在决定为下一次读取提供什么表达式之前检查打印结果。 read-eval-print循环包括程序员比经典的编辑 - 编译 - 运行 - 调试循环更频繁。

因为打印函数以读取函数用于输入的相同文本格式输出,所以大多数结果以可以(如果有用的话)被复制并粘贴回REPL的形式打印。然而,有时需要打印不能被理解地读回的元素的表示,例如套接字句柄或复杂类实例。在这些情况下,必须存在不可读对象的语法。在Python中,它是<__ module __。class instance>符号,在Common Lisp中,#<whatever>形式。 CLIM,SLIME和Symbolics Lisp Machine的REPL也可以读回不可读对象。它们记录每个输出打印的对象。稍后当代码被读回时,将从打印输出中检索对象。

可以创建REPL以支持任何语言。对编译语言的REPL支持通常通过在提供编译器接口的虚拟机之上实现解释器来实现。用于编译语言的REPL的示例包括CINT(及其后继者Cling),Ch和BeanShell。

  • 用途

几乎所有的UNIX shell都是图灵完整语言的REPL。 作为shell,除了提供对编程能力的访问之外,REPL环境允许用户访问操作系统的相关特征。

除在操作系统shell之外的REPL最常见的用途是即时原型。 其他用途包括数学计算,创建集成科学分析(例如IPython),交互式软件维护,基准测试和算法探索的文档。

REPL可以成为学习新语言的重要组成部分,因为它向新手提供快速反馈。

  • 实现

要实现Lisp REPL,只需要实现这三个函数和一个无限循环函数。 (当然,eval的实现将是复杂的,因为它还必须实现所有的原始函数像car和+和特殊的操作符,如if)。这样做,一个基本的REPL本身只是一行代码:

(loop (print (eval (read))))

eval的一个可能的实现是作为递归解释器,作用于通过读取创建的抽象语法树。 另一种可能性是将语法树编译成机器码并执行它。

Lisp中的实际REPL实现通常要复杂得多。

  • 功能

Lisp REPL提供的典型功能包括:

  1. 输入和输出的历史。
  2. 为输入表达式和结果设置变量。这些变量也可在REPL中使用。例如在Common Lisp *中指的是最后的结果,**和***之前的结果。
  3. REPL的层级。在许多Lisp系统中,如果在读取,评估或打印表达式期间发生错误,系统不会返回到顶层并显示错误消息。相反,一个新的REPL,一级更深,在错误上下文中启动。然后,用户可以检查问题,修复并继续(如果可能)。如果在这种调试REPL中发生错误,则开始另一个REPL,再一次更深一层。通常,REPL提供特殊的调试命令。
  4. 错误处理。 REPL提供重新启动。当发生错误以返回到某个REPL级别时,可以使用这些重新启动。
  5. 数据对象的鼠标敏感输入和输出。输入编辑和上下文特定完成符号,路径名,类名和其他对象。
  6. 命令的帮助和文档。
  7. 控制读写器的变量。例如,变量* read-base *控制默认情况下读取的基数。
  8. 控制打印机的变量。示例:要打印的表达式的最大长度或最大深度。
  9. 其他命令语法。一些REPL具有不遵循s表达式语法的命令,但通常使用Lisp数据作为参数。
  10. 图形REPL。一些Lisp REPL(CLIM监听器是一个例子)也接受图形输入和输出。
  • 参考文献

hey,Tony; Pápay,Gyuri(2014)。 计算宇宙:革命之旅。 剑桥大学出版社。 p。 76. ISBN 978-1-31612322-5,“现代脚本语言的一个主要特征是它们的交互性,有时被称为REPL编程环境...。使用REPL环境的易用性和立即执行的特性有时 作为脚本语言的定义。

  • 外部链接

Paul Graham在Common Lisp中写了一个REPL实现的描述
JoëlFranusic Online-REPs-and-REPLs列表
repl.it是用于各种编程语言的客户端web REPL。

 

© 著作权归作者所有

共有 人打赏支持
张宏亮1982
粉丝 13
博文 184
码字总数 13456
作品 0
杭州
clojure 新手指南(2)使用REPL求值

Clojure 拥有动态语言的所有好处。这意味着你可以在程序被加载后依然可以改变它,并且不用采取额外的步骤去编译代码。你既不用停止也不用重启正在运行的应用就可以让修改生效。这对于其他语言...

凯奥斯 ⋅ 2013/07/03 ⋅ 0

node --REPL

REPL(Read Eval Print Loop:交互式解释器),它类似于windows系统的终端,我们可以在终端中输入命令,并接受系统的响应。 node自带了交互式解释器,可以执行如下任务: 1>读取:读取用户输入,...

求是科技 ⋅ 2016/07/08 ⋅ 0

NetBeans开发Clojure的插件--Enclojure

对于Clojure 开发者来说,开发工具首选是使用NetBeans IDE的Enclojure插 件,Enclojure 提供了支撑Clojure 开发的一组类库,包含独立的REPL(Read/Evaluate/Print/Loop)支持,同时支持REPL ...

匿名 ⋅ 2010/09/06 ⋅ 0

GCL笔记01-LISP基础知识

LISP两大方言系:Common Lisp以及Scheme Lisp(以下简称cl与scheme),之所以说是方言系,是因为LISP语言具有很高的灵活性,语法很容易转化成另一种形态,每一个语法系都有众多的版本实现。 ...

兰穆达 ⋅ 2012/05/23 ⋅ 2

storm启动命令

1.启动nimbus,进程名为nimbus 在nimbus虚拟机上去输入 : nohup storm nimbus & 2.启动supervisor,进程名为supervisor 在supervisor虚拟机上去输入 : nohup storm supervisor & 3.启动ui,进...

如风达 ⋅ 2015/01/23 ⋅ 0

TPYBoard 获取MicroPython提示

REPL(交互式解释器)全称是 Read Evaluate Print Loop, pyboard 允许用户和 MicorPython 的交互式连接。使用REPL 是测试代码和运行指令的最易方式。使用 REPL 可以往 main.py 中增添脚本内...

bodasisiter ⋅ 2016/08/22 ⋅ 1

scala基础篇-getting started

REPL, read evaluate print loop. `object MyModule {def main(args: Array[String]): Unit = { }def abs(n: Int): Int = { }}以.scala为后缀的文件,要么定义object要么定义class。object也......

RogerIs谭纶 ⋅ 2015/02/21 ⋅ 0

Tool系列—Babel

1、简单介绍 这些转换器 (更准确地说是源代码到源代码的编译器) 可以把你写的符合ECMAScript 6 标准的代码完美地转换为 ECMAScript 5 标准的代码,并且可以确保良好地运行在所有主流 JavaSc...

龙马行空 ⋅ 2015/11/20 ⋅ 0

JVM上的并发编程利器:Clojure语言

诞生于2007年的Clojure是JVM平台上的Lisp实现,Lisp 以强大的功能和表达性而著称,但应用范围存在着固定的局限,于是发起人Rich Hickey设计Clojure的初衷便是希望得到一门能够服务于高并发应...

红薯 ⋅ 2010/09/06 ⋅ 2

2017/01/31

最近两天学习 ML 语言。 环境搭建 Emacs 安装 SML/NJ 安装 使用 Emacs 中的 SML/NJ REPL (Read-Eval-Print-Loop) Emacs 常用快捷键 绑定的概念 binding static environment, dynamic enviro...

Joker233 ⋅ 2017/01/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 53分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部