Scheme 测试Guile函数中是否发生错误
我正在尝试创建一个Guile函数,用于测试任意表达式是否抛出错误,但是否遇到了问题Scheme 测试Guile函数中是否发生错误,scheme,guile,Scheme,Guile,我正在尝试创建一个Guile函数,用于测试任意表达式是否抛出错误,但是否遇到了问题 (define (error-or-not qqx) (if (catch #t (lambda () ,qqx) (lambda (k . args) #t)) #t #f)) (display (error-or-not `(/ 1 0))) ; => #t (1) (newline) (display (error-or-not `(/
(define (error-or-not qqx)
(if
(catch
#t
(lambda () ,qqx)
(lambda (k . args) #t))
#t
#f))
(display (error-or-not `(/ 1 0))) ; => #t (1)
(newline)
(display (error-or-not `(/ 1 1))) ; => #t (2)
(newline)
qqx
是一个准整数表达式,在error or not
函数中进行计算,并测试它是否会导致错误
实际上,如果求值qqx
抛出错误,则catch
函数返回调用其第三个参数(接受参数的lambda)得到的值。如果qqx
确实导致了错误(请参见上面的#1),则此功能可以正常工作
但手册还指出,如果没有错误,catch
函数将从计算qqx
返回值。这对我来说效果不太好,因为我无法区分这两种情况(见上文第2段)
有人能指出如何确定何时没有发生错误吗
更新 克里斯·杰斯特·杨指出了我的错误——见下面的公认答案。为了完整起见,我发布了我正在使用的他的代码版本(后端口为Guile 1.8.8):
你误用了准液化;它没有达到你的期望。特别是,它不能替代
eval
。您使用的(lambda(),qqx)
创建了一个调用时总是失败的函数,因为unquote
不能在quasikote
表单之外使用
实现所需功能的最佳方法是作为宏:
(define-syntax-rule (error-or-not expr ...)
(catch #t
(lambda () expr ... #f)
(const #t)))
例如:
(error-or-not (/ 1 0)) ; => #t
(error-or-not (/ 1 1)) ; => #f
Guile 1.8兼容版本:
(use-syntax (ice-9 syncase))
(define-syntax error-or-not
(syntax-rules ()
((_ expr ...)
(catch #t (lambda () expr ... #f)
(lambda _ #t)))))
您的代码根本不会求值,因为您在quasiquoting之外有一个自由(unquote)表单。你真的包含了你所有的代码吗?@Dolda2000-我已经更新了一个代码示例,将对其进行评估。谢谢你指出这一点。正如克里斯·杰斯特·杨在他的回答中指出的那样,这仍然无法评估。错误消息是
unquote:form(unquote qqx)
中quasikote之外的表达式无效。你到底在做什么来测试它?@Dolda2000-谢谢,我现在意识到我的错误(请原谅双关语)。为了回答您的问题,我正在编写一个单元测试框架:GitHub:yawaramin/ggspec。谢谢!那很聪明。(关于unquote
太糟糕了。)我会用你的代码更新我的问题,后端口到Guile 1.8。我会添加一个Guile 1.8兼容的版本,但Guile团队不再支持1.x版本,以防你还不知道。:-)啊,我不知道,谢谢,但我的目标是1.8,因为它与GnuCash的旧版本一起发布。
(use-syntax (ice-9 syncase))
(define-syntax error-or-not
(syntax-rules ()
((_ expr ...)
(catch #t (lambda () expr ... #f)
(lambda _ #t)))))