(datatype list (:nil) (:cons 'a (list 'a))) (define map-pairs f (list:nil) ys -> (list:nil) f (list:cons x xs) (list:nil) -> (list:nil) f (list:cons x xs) (list:cons y ys) -> (list:cons (f x y) (map-pairs f xs ys))) ;; original version: ;(define (reverse-onto l1 l2) ; (vcase list l1 ; ((:nil) l2) ; ((:cons hd tl) ; (reverse-onto tl (list:cons hd l2))) ; )) ;; pattern-matching version: (define reverse-onto (list:nil) y -> y (list:cons x xs) y -> (reverse-onto xs (list:cons x y)) ) ;; with list syntax help: ;(define reverse-onto ; [] y -> y ; [x :: xs] y -> (reverse-onto xs [x :: y]) ; ) (define (reverse l) (reverse-onto l (list:nil))) (define (+ a b) (%%cexp (int int -> int) "%0+%1" a b)) (reverse (map-pairs + '(1 2 3 4) '(5 6 7 8)))