我聽說「call/cc」可以用來實現任意控制流構造,所以我試圖用「call/cc」實現所有這樣的構造,但是我遇到了麻煩。假設我沒有「如果」我將如何使用「define-syntax」和「call/cc」來實現它?有可能或者我被誤導了嗎?我知道如何使用「call/cc」實現無條件跳轉,但是在機器級執行條件執行是通過分支指令執行的,分支指令的執行取決於處理器的狀態位。沒有這種類型的構造,我不知道它是如何完成的。可以使用「call/cc」實現「if」嗎?
4
A
回答
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
本身是不是真的做任何有關...
2
如果只有更高階的程序,您可以執行。這是明顯的uncurried教會編碼:
IF ? T E === (? (lambda() T) (lambda() F))
TRUE === (lambda (t _) (t))
FALSE === (lambda (_ f) (f))
你根本不需要的延續。 True是執行第一個參數的二進制函數; False是執行第二個參數的二進制函數。如果是三元函數,它們通過獲得由測試(?)確定的真/假來將它們排列在一起,並給它兩個延遲結果的函數。
相關問題
- 1. 我可以使用增強現實嗎?
- 2. 可以使用django實現Numpy嗎?
- 3. callCC如何以嚴格的功能語言實現?
- 4. 可以用Twitter Bootstrap實現Modernizr嗎?
- 5. 我可以使用ninject實時更改實現嗎?
- 6. 我可以使用比較器而不實現可比較嗎?
- 7. 使用MYSQL聯合可以實現以下功能嗎?
- 8. 使用弱引用時可以實現NSFastEnumeration嗎?
- 9. 可以使用引用來實現函數重寫嗎?
- 10. 我可以自動實現類嗎?
- 11. InfoView中可以實現VideoView嗎?
- 12. ConstraintLayout可以實現這種設計嗎?
- 13. ExtJS可以實現這種設計嗎?
- 14. 可以重載接口的實現嗎?
- 15. 服務可以實現MediaPlayer.OnPreparedListener和MediaController.MediaPlayerControl嗎?
- 16. 可以通過Clojure實現Arc嗎?
- 17. 單個LINQ查詢可以實現嗎?
- 18. 這可以並行實現Matlabpool嗎?
- 19. BLE可以實現廣播回放嗎?
- 20. c#app:可以實現JSON接口嗎?
- 21. 它可以在Android上實現嗎?
- 22. Quartz調度程序可以實現嗎?
- 23. 可以實現並行處理嗎?
- 24. 這可以在Mac OSX上實現嗎?
- 25. 導航控制器可以實現嗎?
- 26. 可以在Xamarin.Android中實現android.support.v7.util.sortedlist嗎?
- 27. Powershell - 可以INotifyPropertyChanged本地實現嗎?
- 28. 我可以使現有(固定)類實現新的界面嗎?
- 29. 我可以使用Phonegap實現iTunes/Android付款嗎
- 30. 使用Flexbox CSS可以實現這種響應式佈局嗎?
我不認爲你可以。將布爾值定義爲函數會改變語言的語義,使得布爾運算符必須重新定義,因爲在Scheme中,任何函數在被視爲布爾值時都是非錯誤的。 – N4tur41Myst1c
是的,這樣的改變會導致不同的語言...這就是爲什麼我開始「你不能」。 –