5.4.3 條件,賦值,定義
5.4.3 條件,賦值,定義
作為元迴圈的直譯器,通過選擇表示式的解釋的片段來處理特殊的形式。對於一個條件的
表示式,我們必須解釋判斷式和決定,基於判斷式的值,解釋真值的語句或者是假值時的
語句。
在解釋判斷式之前,我們儲存條件表示式本身,為了我們能在稍後的時候,抽取到
真值時的語句或者是假值時的語句,並且我們儲存了continue,它是我們在稍後需要用到的,
為了返回到表示式的解釋,這個表示式正在等待條件表示式的值。
ev-if
(save exp) ; save expression for later
(save env)
(save continue)
(assign continue (label ev-if-decide))
(assign exp (op if-predicate) (reg exp))
(goto (label eval-dispatch)) ; evaluate the predicate
當我們從解釋判斷式返回時,我們測試它是真還是假,根據這個結果,
在去eval-dispatch之前,把真值的語句或者是假值的語句放在exp暫存器中。
注意的是為了有正確的環境,為了在接收了條件表示式的值後能回到正確的地方,
在設定eval-dispatch這裡恢復env和continue.
ev-if-decide
(restore continue)
(restore env)
(restore exp)
(test (op true?) (reg val))
(branch (label ev-if-consequent))
ev-if-alternative
(assign exp (op if-alternative) (reg exp))
(goto (label eval-dispatch))
ev-if-consequent
(assign exp (op if-consequent) (reg exp))
(goto (label eval-dispatch))
* 賦值和定義
ev-assignment處理賦值,從eval-dispatch帶著賦值表示式到達了ev-assignment,
並且賦值表示式放在exp暫存器中。ev-assignment中的程式碼首先解釋表示式的值部分,
並且然後在環境中安裝新的值。set-variable-value!被假定是可用的,作為一個機器的操作。
ev-assignment
(assign unev (op assignment-variable) (reg exp))
(save unev) ; save variable for later
(assign exp (op assignment-value) (reg exp))
(save env)
(save continue)
(assign continue (label ev-assignment-1))
(goto (label eval-dispatch)) ; evaluate the assignment value
ev-assignment-1
(restore continue)
(restore env)
(restore unev)
(perform
(op set-variable-value!) (reg unev) (reg val) (reg env))
(assign val (const ok))
(goto (reg continue))
定義的處理也是相似的:
ev-definition
(assign unev (op definition-variable) (reg exp))
(save unev) ; save variable for later
(assign exp (op definition-value) (reg exp))
(save env)
(save continue)
(assign continue (label ev-definition-1))
(goto (label eval-dispatch)) ; evaluate the definition value
ev-definition-1
(restore continue)
(restore env)
(restore unev)
(perform
(op define-variable!) (reg unev) (reg val) (reg env))
(assign val (const ok))
(goto (reg continue))
練習5.23
擴充套件直譯器來處理可推導的表示式,例如cond,let,等等(見部分4.1.2)
你可能欺騙或者是假定語法轉換器例如cond->if是可用的,作為一個機器的操作。
練習5.24
實現cond作為一個新的基本的關鍵,而沒有把它歸結到條件。你將不得不
組裝一個迴圈,測試連續的cond子句的判斷式,直到你找到一個是真的,並且
然後使用ev-sequence來解釋子句的動作。
練習5.25
修改直譯器為了讓它能使用正常序來解釋,基於4.2部分的推遲直譯器。