(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)))