1. 程式人生 > >5.4.3 條件,賦值,定義

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部分的推遲直譯器。