This function is developed in The Seasoned Schemer pp. 55-60. It accepts an atom a and a list of atoms lst, and returns the part of lst following the last occurrence of a. If a is not in lst, it returns lst unaltered.

#lang racket

(define (atom? x)
  (and (not (pair? x)) (not (null? x))))

(define alpha
  (lambda (a lst)
    (let/cc k ; calling k with val will immediately return val from the call to alpha
      (letrec ([aux (lambda (l)
                      (cond
                        [(null? l) '()]
                        [(eq? (car l) a)
                         ; we abandon any waiting recursive (aux ...) calls, and instead immediately return (aux (cdr l))
                         ; ...since Scheme is call-by-value, (aux (cdr l)) will be evaluated first, and
                         ; any calls to k therein will come first (and the pending (k ...) here will be abandoned)
                         (k (aux (cdr l)))]
                        [else (cons (car l) (aux (cdr l)))]))])
        (aux lst)))))


(alpha 'a '(a b c a d e f)) ; ~~> '(d e f)
(alpha 'x '(a b c a d e f)) ; ~~> '(a b c a d e f)
(alpha 'f '(a b c a d e f)) ; ~~> '()
(alpha 'a '(a b c x d e f)) ; ~~> '(b c x d e f)