+fun webPlace (EApp ((EVar "web_place_default", _), (EString node, _)), _) =
+ SOME (node, Domain.nodeIp node)
+ | webPlace (EApp ((EApp ((EVar "web_place", _), (EString node, _)), _), (EString ip, _)), _) =
+ SOME (node, ip)
+ | webPlace _ = NONE
+
+fun webPlaceDefault node = (EApp ((EVar "web_place_default", dl), (EString node, dl)), dl)
+
+val _ = Env.registerFunction ("web_place_to_web_node",
+ fn [e] => Option.map (fn (node, _) => (EString node, dl)) (webPlace e)
+ | _ => NONE)
+
+val _ = Env.registerFunction ("web_place_to_node",
+ fn [e] => Option.map (fn (node, _) => (EString node, dl)) (webPlace e)
+ | _ => NONE)
+
+val _ = Env.registerFunction ("web_place_to_ip",
+ fn [e] => Option.map (fn (_, ip) => (EString ip, dl)) (webPlace e)
+ | _ => NONE)
+