let prim2 (prim: string) (r1: rslt) (r2: rslt)
  : rslt =
    begin match (prim, r1, r2) with
    | ("==", _, _) -> Bool_value(r1 = r2)
    | ("||"Bool_value(bl1), Bool_value(bl2)) -> Bool_value(bl1 || bl2)
    | ("&&"Bool_value(bl1), Bool_value(bl2)) -> Bool_value(bl1 && bl2)
    | ("+"String_value(s1), String_value(s2)) -> String_value(s1 ^ s2)
    | ("*"Int_value(n1), Int_value(n2)) -> Int_value(n1 * n2)
    | ("+"Int_value(n1), Int_value(n2)) -> Int_value(n1 + n2)
    | ("-"Int_value(n1), Int_value(n2)) -> Int_value(n1 - n2)
    | ("addtourl"Url_value(u), String_value(s)) -> Url_value
        ( match u with 
            | Blank_url -> Blank_url
            | Http_url (domain, {req_uri_path = {path_value=path};
                        req_uri_params = params}) ->
                 Http_url (domain, {req_uri_path = {path_value=path};
                                    req_uri_params = params ^ "?t=" ^ s})
         )
    | (_, (Error(_) as r1), _) -> r1
    | (_, _, (Error(_) as r2)) -> r2
    | (_, _, _) ->
        Error (
          "primitive operation (" ^ prim ^
            ") is not implemented for these types")
    end