puts the fun newLISP button back in Lisp

Translating S-expressions into XML

updated: 2007-01-08

newLISP has built in support for parseing XML into s-expressions using xml-parse, but going the other way translating s-expressions into XML has to be coded. Fortunately this is a natural task for LISP with a recursive algorithm. The following function can be used to translate a LISP s-expression back into XML (syntax highlighted version here ):

;; translate s-expr to XML
(define (expr2xml expr (level 0))
   ((or (atom? expr) (quote? expr))
       (print (dup "  " level))
       (println expr))
   ((list? (first expr))
       (expr2xml (first expr) (+ level 1))
       (dolist (s (rest expr)) (expr2xml s (+ level 1))))
   ((symbol? (first expr))
       (print (dup "  " level))
       (println "<" (first expr) ">")
       (dolist (s (rest expr)) (expr2xml s (+ level 1)))
       (print (dup "  " level))
       (println "</" (first expr) ">"))
      (print (dup "  " level) 
      (println "<error>" (string expr) "<error>")))

;; a lisp expression for a person

(set 'expr '(person
              (name "John Doe")
              (address (street "Main Street") (city "Anytown"))))

;; translate to XML with default indentation 0

(expr2xml expr)   =>

     John Doe
         Main Street

The second parameter 0 is the indentation level for the outermost tag expression.