讀取-求值-輸出循環
「讀取-求值-輸出」循環(英語:Read-Eval-Print Loop,簡稱REPL), 嘛予人號做交互式頂層構件(英語:interactive toplevel), 是一个簡單的,交互式的編程環境。這个詞定定用著指代一个 Lisp 的交互式開發環境,也通指代命令行的模式。
概述
_「讀入去-求值-輸出」循環 _ 的名來自以下幾个 Lisp 用來實現這種機制的內置函數:
- 讀入函數接收一个來自用戶的表達式,共解析做資料結構並存入記憶體。比如講,用戶可能會輸入一个 s-表達式 ` ( + 一二三 ) `,這句話會予人解破做一个包含四个元素的鍊表。
- 求值函數負責處理內部的資料結構並對其求值。佇咧 Lisp 中,求一个以函數名來開頭的 s-表達式意味著著紲落來參數調用彼个函數。所以函數 " ` + ` " 被佇參數 ` 一二三 ` 上調用,產生結果 ` 六 `。
- 輸出函數接受求值結果,閣呈現予用戶。就算講進前的結果「` 六 `」並無有複雜的格式,但是若是一个較複雜的表達式,按呢伊將會予精心處理,也會當佇閣較方便便的去予人理解。
REPL 予得探索性的編程佮調試閣較利便,因為乎「讀取-求值-輸出」循環通常會比經典的「編輯-編譯-運行-調試」模式愛較緊。
優點
REPL 對學習一門新的程式語言有真大的幫贊,因為伊會當隨對初學者做出回應。誠濟工具集佮程式語言使用 REPL 研究算法、進行調試,比如講 MATLAB,ROOT,SciPy 和 IPython。Python 的 doctest 模塊會當通過掠家己的身軀 REPL 命令行的輸出使測試代碼閣較容易地來進行。
因為 ` print ` 函數輸出的數據格式(字符串)和用戶輸入的數據格式(字符串)相仝,大部份攏輸出的結果嘛會當予人帶轉來 ` read ` 函數作為輸入。毋過,有的時陣輸出的結果干焦會當代表求值結果而毋是求值結果本身,比如一个 socket 句柄抑是一寡類的實例。比如講佇 Python 中使用 ` < _ _ 模仿名 _ _ . 徛名號名 > ` 這種形式來代表一个實例本身,佇咧 Common Lisp 中間就使用 ` # < whatever > ` 彼个形體。啊若佇咧 CLIM,SLIME 以及 Symbolics Lisp Machine 的 REPL 煞有法度讀袂歹去予完全字符合串化的遮的對象。𪜶記錄被輸出過的對象,了後做代碼去予人讀的時陣,遮的對象會當予人解破閣重新予人使用。
實現
為著實現一个 Lisp REPL,只需要實現這三个函數和一个不停輪詢的函數即可(當然喔,求值函數的實現是上複雜的,因為伊佇內底愛實現像 ` car ` 佮 ` + ` 的原始函數佮像 ` if ` 仝款的特殊操作符仔)。 遮的工課做好了後,一个基本的 REPL 就會當用如下的簡單形式表達:` ( loop ( print ( eval ( read ) ) ) ) `。
一種實現 ` eval ` 的方式就是實現一个遞歸處理抽象語法樹(該語法樹去予 ` read ` 函數創建)的函數。另外一種會當的方法是共這个抽象語法樹編譯做機器碼並執行。
主要的 REPL 程式語言環境
APL、BASIC、Clojure、F #、Haskell、J、Julia、Perl、PHP、Prolog、Python、R、Ruby、Scala、Smalltalk、Standard ML、Swift、Tcl、Javascript、Java ( 版本 jdk 操九起 )