procedure SelectorIdentifier; procedure SelectorReturnType; procedure SelectorArgumentTypes; Selector?(T) = CallDefined?(SelectorIdentifier, Static[T]) and CallDefined?(SelectorReturnType, Static[T]) and CallDefined?(SelectorArgumentTypes, Static[T]); [I | Identifier?(I)] selector(name: I, ReturnType, ...ArgumentTypes) = recordWithProperties( ( (SelectorIdentifier, name), (SelectorReturnType, ReturnType), (SelectorArgumentTypes, Tuple(...ArgumentTypes)) ) );