tests.ss
;;    (require (planet "aspect-scheme.ss" ("cdutchyn" "aspect-scheme.plt" 1 0)))

(define (open-file f)
  (print (list "open file" f))
  (newline))

(define open-adv (call open-file))

(define (((trace-adv s) proceed) a)
  (print (list "advised" s a))
  (newline)
  (app/prim proceed a))

(define (mymap f l)
  (if (null? l)
      '()
      (cons (f (car l)) (mymap f (cdr l)))))

(around open-adv (trace-adv 0)
  (open-file "boston"))

(around open-adv (trace-adv "1a")
  (map open-file '("boston" "providence")))

(around open-adv (trace-adv "1b")
  (mymap open-file '("boston" "providence")))

(map (around open-adv (trace-adv 2)
       (lambda (f) (open-file f)))
     '("boston" "providence"))

(fluid-around open-adv (trace-adv 3)
  (map open-file '("boston" "providence")))

(map (fluid-around open-adv (trace-adv 4)
       (lambda (f) (open-file f)))
     '("boston" "providence"))

(around open-adv (trace-adv "6a")
  (around open-adv (trace-adv "5a")
    (open-file '"boston")))

(around open-adv (trace-adv "6b")
  (around open-adv (trace-adv "5b")
    (map open-file '("boston" "providence"))))

(around open-adv (trace-adv "6c")
  (around open-adv (trace-adv "5c")
    (mymap open-file '("boston" "providence"))))

(fluid-around open-adv (trace-adv "12")
  (fluid-around open-adv (trace-adv "11")
    (mymap open-file '("boston" "providence"))))

(around open-adv (trace-adv 8)
  (fluid-around open-adv (trace-adv 7)
    (open-file "boston")))

((fluid-around open-adv (trace-adv 9)
 (around open-adv (trace-adv 10)
   (lambda (f) (open-file f))))
 "boston")

(fluid-around open-adv (trace-adv "12")
  (fluid-around open-adv (trace-adv "11")
    (map open-file '("boston" "providence"))))

(fluid-around open-adv (trace-adv "14")
  (fluid-around open-adv (trace-adv "13")
    (mymap open-file '("boston" "providence"))))


(newline)

(define (fact n k)
  (if (= 0 n)
      k
      (fact (- n 1) (* k n))))

(around (call fact)
        (lambda (proceed)
          (lambda (n k)
            (print (list n k))
            (newline)
            (proceed n k)))
  (fact 4 1))

(fluid-around (call fact)
              (lambda (proceed)
                (lambda (n k)
                  (print (list n k))
                  (newline)
                  (app/prim proceed n k)))
  (fact 4 1))

(define (foo) #t)

(around (|| (call foo) (call open-file)) (trace-adv '||)
    (open-file "boston"))

(around (&& (call foo) (call open-file)) (trace-adv '&&)
    (open-file "boston"))

(around (|| (call call) (call open-file)) (trace-adv '||call1)
    (open-file "boston"))

(fluid-around (|| (call call) (call open-file)) (trace-adv '||call2)
    (open-file "boston"))