Scheme 测试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 `(/

我正在尝试创建一个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 `(/ 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)))))