【发布时间】:2018-12-30 11:43:25
【问题描述】:
我想用call/cc来模拟异常处理语句:try...(throw)...exception。代码如下:
(define (month n) ; check if it's a month number (1-12)
(if (or (not (integer? n)) (< n 1) (> n 12))
(throw -1)
(display n)
)
)
(define error (call/cc
(lambda(throw)
(begin
(month 12)
(month -1)
(throw -1) ; won't be executed
(month 10)
(display "Hello world")
)
)
)
)
(if error
(display Error occured!")
)
但是,当我执行它时,它显示了错误(在 biwascheme 中):
Error: execute: unbound symbol: "throw" [(anon), month]
我认为 lambda 中的 throw 与被调用函数“month”中的 throw 不一样,但是,我该如何解决呢?用一些关键字制作marco可以解决吗?例如:
(define-syntax exception-handling
(syntax-rules (throw raise error)
((_ body catch)
(define (error
(call/cc (lambda (throw) (begin body))))
)
(if error (begin catch)))
)
)
【问题讨论】:
-
对重新格式化表示敬意——最重要的是,保持参与!在编写代码时,将右括号放在一行中的方式可以使编辑更容易;但是一旦我们有了代码,习惯上将所有右括号放在同一行,让缩进指导我们阅读代码。
标签: exception-handling scheme callcc