(define create-empty-ff
  (lambda () ()))

(define extend-ff
  (lambda (sym val ff)
    (cons (cons (list sym) (vector val)) ff)))

(define extend-ff* 
  (lambda (sym-list val-list ff)
    (cons (cons sym-list (apply vector val-list)) ff)))

(define list-index 
  (lambda (s los)
    (cond 
     ((null? los) -1)
     ((eq? s (car los)) 0)
     (else
      (let ((n (list-index s (cdr los))))
        (if (= n -1)
            -1
            (+ 1 n)))))))

(define ribassoc
  (lambda (s los v fail-value)
    (let
        ((n (list-index s los)))
      (if (= n -1)
          fail-value
          (vector-ref v n)))))

(define apply-ff
  (lambda (ff symbol)
    (if (null? ff) 
        '*fail*
        (let
            ((val (ribassoc symbol (caar ff) (cdar ff) '*fail*)))
          (if (eq? val '*fail*)
              (apply-ff (cdr ff) symbol)
              val)))))