home: hub: zuo

ref: b5000406fb9352c7ded0e0c9bf80f64e0b31ed6a
dir: /tests/procedure.zuo/

View raw version
#lang zuo

(require "harness.zuo")

(alert "procedures")

(check (procedure? procedure?))
(check (procedure? (lambda (x) x)))
(check (procedure? (lambda args args)))
(check (procedure? apply))
(check (procedure? call/cc))
(check (procedure? (call/cc (lambda (k) k))))
(check (not (procedure? 1)))

(check (apply + '()) 0)
(check (apply + '(1)) 1)
(check (apply + '(1 2)) 3)
(check (apply + '(1 2 3 4)) 10)
(check (apply apply (list + '(1 2))) 3)
(check-fail (apply +) arity)
(check-fail (apply '(+ 1 2)) arity)
(check-fail (apply apply (cons + '(1 2))) arity)
(check-arg-fail (apply + 1) "not a list")

(check (call/cc (lambda (k) (+ 1 (k 'ok)))) 'ok)
(check (let ([f (call/cc (lambda (k) k))])
         (if (procedure? f)
             (f 10)
             f))
       10)
(check-fail (call/cc 1) "not a procedure")

(check (call/prompt (lambda () 10)) 10)
(check (let ([k (call/prompt
                 (lambda ()
                   (call/cc (lambda (k) k))))])
         (+ 1 (call/prompt (lambda () (k 11)))))
       12)
(check (let ([k (call/prompt
                 (lambda ()
                   (call/cc
                    (lambda (esc)
                      (+ 1
                         (* 2
                            (call/cc
                             (lambda (k) (esc k)))))))))])
         (list (call/prompt (lambda () (k 3)))
               (call/prompt (lambda () (k 4)))))
       (list 7 9))
(check-fail (call/prompt 1) "not a procedure")

(check (let ([k (call/prompt
                 (lambda ()
                   (call/cc
                    (lambda (esc)
                      (+ 1
                         (* 2
                            (call/comp esc)))))))])
         (list (k 30)
               (k 40)))
       (list 61 81))
(check-arg-fail (call/comp 1) "not a procedure")