4

我聽說「call/cc」可以用來實現任意控制流構造,所以我試圖用「call/cc」實現所有這樣的構造,但是我遇到了麻煩。假設我沒有「如果」我將如何使用「define-syntax」和「call/cc」來實現它?有可能或者我被誤導了嗎?我知道如何使用「call/cc」實現無條件跳轉,但是在機器級執行條件執行是通過分支指令執行的,分支指令的執行取決於處理器的狀態位。沒有這種類型的構造,我不知道它是如何完成的。可以使用「call/cc」實現「if」嗎?

回答

7

你不能 - 你必須有一些方式測試的事情,並採取行動,無論他們是真的還是假的。儘管如此,你可以靠近一些布爾函數。例如,具有共同的教堂編碼:

(define (true x y) x) 
(define (false x y) y) 

,現在你可以考慮檢驗(即返回這些編碼的布爾之一)作爲一個接受「成功」的延續和一個「失敗」的一個函數,使用該繼續:

(define (if c x y) (c x y)) 

如果你想用這個實驗,你需要考慮的是,方案是不是一個懶惰的語言,所以你需要咚東西。例如:

(define (true x y) (x)) 
(define (false x y) (y)) 
(define-syntax if 
    [(if c x y) (c (lambda() x) (lambda() y))]) 

(但你仍然需要修改現有的謂詞等歸還這些布爾值。)

無論哪種方式,call/cc本身是不是真的做任何有關...

+0

我不認爲你可以。將布爾值定義爲函數會改變語言的語義,使得布爾運算符必須重新定義,因爲在Scheme中,任何函數在被視爲布爾值時都是非錯誤的。 – N4tur41Myst1c

+0

是的,這樣的改變會導致不同的語言...這就是爲什麼我開始「你不能」。 –

2

如果只有更高階的程序,您可以執行。這是明顯的uncurried教會編碼:

IF ? T E === (? (lambda() T) (lambda() F)) 

TRUE  === (lambda (t _) (t)) 
FALSE === (lambda (_ f) (f)) 

你根本不需要的延續。 True是執行第一個參數的二進制函數; False是執行第二個參數的二進制函數。如果是三元函數,它們通過獲得由測試(?)確定的真/假來將它們排列在一起,並給它兩個延遲結果的函數。

相關問題