我对Scheme编程很新,并且想知道如何在这个程序中添加一些错误检查器。我想检查用户是否输入多个参数,如果用户确实如此,我希望它说它是一个错误。
(define (thirds lst)
(cond ((or (null? lst) (null? (cdr lst))) lst)
((null? (cddr lst)) (list (car lst)))
(else (cons (car lst)
(thirds (cdddr lst))))))
答案 0 :(得分:1)
Scheme解释器应自动检查。如果定义采用扩展参数的过程,则只需要自己检查参数的数量,即
(define (thirds . args)
...)
如果过程采用可变数量的参数,通常只会执行此操作。对于具有静态参数的过程,只需在定义中列出它们,然后让解释器为您进行检查。
如果你真的想亲自检测一下,你可以这样做:
(define (thirds . args)
(if (= (length args) 1)
(let ((lst (car args)))
(cond ... ; all the rest of your code
))
(display "Oh that's an error")))
答案 1 :(得分:0)
所以,在thirds
(语言)中使用#!racket
的定义,并试图像这样使用它:
(thirds '(a b c) '(d e f))
thirds: arity mismatch;
the expected number of arguments does not match the given number
expected: 1
given: 2
arguments...:
'(a b c)
'(d e f)
context...:
/usr/share/racket/collects/racket/private/misc.rkt:87:7
你可以看到所有的计算都停止了,因为我给了一个参数过程两个参数。这是合同违规,它会抛出一个exception。
完全可以制作处理程序:
(with-handlers ([exn:fail:contract?
(λ (e) (displayln "got a contract error"))])
(thirds '(1 2 3) '(4 5 6)))
; prints "got a contract error"