;; lib/maude/pretty.sx — mixfix surface-syntax printer. ;; ;; term->str renders the internal prefix form (`_+_(s_(X), 0)`); this renders ;; terms back in Maude mixfix surface syntax (`((s X) + 0)`), driven by the ;; operator forms in the module signature. Fully parenthesised — unambiguous ;; rather than minimal. Constants and unknown ops fall back to prefix form. (define mau/render-forms (fn (m) (let ((tbl {})) (for-each (fn (op) (dict-set! tbl (get op :name) (mau/op-form (get op :name)))) (mau/module-ops m)) tbl))) (define mau/render-args (fn (forms args) (cond ((empty? args) "") ((empty? (rest args)) (mau/render-term forms (first args))) (else (str (mau/render-term forms (first args)) ", " (mau/render-args forms (rest args))))))) (define mau/render-term (fn (forms t) (cond ((mau/var? t) (mau/vname t)) ((mau/app? t) (let ((form (get forms (mau/op t))) (args (mau/args t))) (cond ((empty? args) (mau/op t)) ((and form (= (get form :kind) "infix") (= (len args) 2)) (str "(" (mau/render-term forms (nth args 0)) " " (get form :token) " " (mau/render-term forms (nth args 1)) ")")) ((and form (= (get form :kind) "prefix") (= (len args) 1)) (str "(" (get form :token) " " (mau/render-term forms (first args)) ")")) ((and form (= (get form :kind) "postfix") (= (len args) 1)) (str "(" (mau/render-term forms (first args)) " " (get form :token) ")")) (else (str (mau/op t) "(" (mau/render-args forms args) ")"))))) (else (str t))))) (define mau/term->maude (fn (m t) (mau/render-term (mau/render-forms m) t))) ;; reduce / rewrite then render in surface syntax (define mau/red->maude (fn (m src) (mau/term->maude m (mau/creduce-term m src)))) (define mau/rew->maude (fn (m src) (mau/term->maude m (mau/rewrite-term m src))))