# --------------------------------------------------------------------------- # Exploring the idea of a "finite function" (Session 23) # --------------------------------------------------------------------------- # # --------------------------------------------------------------------------- # a finite function implemented in Python as a list of tuples # --------------------------------------------------------------------------- f1 = [("foo", 2), ("bar", 5), ("baz", 15)] # --------------------------------------------------------------------------- # a finite function implemented in Python as a dictionary # --------------------------------------------------------------------------- f2 = {"foo": 2, "bar": 5, "baz": 15} # --------------------------------------------------------------------------- # a finite function implemented as a Python function # --------------------------------------------------------------------------- def f(arg): if arg == "foo": return 2 elif arg == "bar": return 5 elif arg == "baz": return 15 else: raise ValueError('ff -- argument not in domain: {}'.format(arg)) # --------------------------------------------------------------------------- # a finite function that extends an existing finite function named f # with a new ordered pair: (bif, 64) # --------------------------------------------------------------------------- # (define f-plus-bif # (lambda (arg) # (cond ((eq? arg 'bif) 41) # (else (f arg))))) def f_plus_bif(arg): if arg == "bif": return 41 else: return f(arg) # --------------------------------------------------------------------------- # we can even implement extend_ff as a higher-order function # --------------------------------------------------------------------------- def extend_ff(sym, val, ff): return lambda arg: val if arg == sym else ff(arg) # ---------------------------------------------------------------------------