Hello Stefan, stefan <stefan.ta...@spray.se> writes:
> I have started to code in some record recognition into the match construct Excellent! :-) Are you hacking Wright’s match as currently in Guile or Alex Shinn’s rewrite from <http://synthcode.com/scheme/>? > I need first to make sure that I grok the intention of the syntax! Do the comments in (ice-9 match) and the examples in the paper that in match.tar.gz at <http://www.cs.indiana.edu/scheme-repository/code.match.html> help? You could ask on comp.lang.scheme too. :-) > Now, one can do ... > > * (define rtf (make-record-type "n" '(x y z))) > * (define make-n (record-constructor rtf)) > * (define v (make-n 1 2 3)) > * (define g (record-accessor rtf 'x)) > * (define s (record-modifier rtf 'x)) FWIW I’d really prefer if it could work with SRFI-9 (which is purely syntactic, so there’s no run-time record type descriptor) rather than with Guile’s records (as above). > * (match v ((= g 1) 'yes)) ;; This is the old behavior > yes > > ;; = allow for a getter and setter argument so that we can do ... > * (match v ((= (g s) (and (set! x.set) > * (get! x.get) > * 1)) > * (begin (x.set 2) > * (x.get)))) > 2 > > ;;Now the $ syntax work, although a lot of unpacking of accessors and > modifiers > ;;are done dynamically and not at compile time. > * (match v (($ rtf x 2 3) x)) > 2 I think it should be: (match v (($ n x 2 3) x)) The original API assumes that when ‘n’ appears as the record-type above, then there exists a type predicate called ‘n?’, a procedure called ‘n-x’ to access the ‘x’ field, etc. > * (match v ( ($ rtf > * x > * (and (set! y.set) > * (get! y.get)) > * 3) > * (begin (y.set 4) > * (+ x (y.get))))) > 6 > > It's recursive. OK. So would the following work? (define x (make-n 1 2 (make-n (3 4 (make-n 5 6 7))))) (match x (($ n x y ($ n p q ($ n a b c))) (list a b c p q x y))) As noted in Shinn’s match-cond-expand.scm, this record matching form is not ideal: ;; Annoying unhygienic record matching. Record patterns look like ;; ($ record fields...) ;; where the record name simply assumes that the same name suffixed ;; with a "?" is the correct predicate. Thanks! Ludo’.