+ (=> direct-obj (+ any))))) ; direct object (kept)
+
+(define (cmatch-direct-obj phrase)
+ (match-to-kwargs direct-irx phrase))
+
+(define (cmatch-empty phrase)
+ (if (equal? (string-trim phrase) "")
+ '()
+ #f))
+
+(define (cmatch-direct-obj-greedy phrase)
+ ;; Turns out this uses the same semantics as splitting verb/rest
+ (match (split-verb-and-rest phrase)
+ ((direct-obj . rest)
+ (list #:direct-obj direct-obj
+ #:rest rest))
+ (#f #f)))