> On Mar 14, 2018, at 11:38 PM, siddharth.s...@gmail.com wrote:
> 
> I tried converting the S-expressions into nested hash-table by checking if it 
> car(list) is a list or not and making it a key with value a blank dictionary. 
> This turned to be more difficult than I anticipated. 

If you just want to store the X-expression in JSON, you can always just 
serialize it as a string:

#lang racket
(require json)
(define x '(root (p "Hello world" 42) (p "Goodbye")))
(define jsx (format "~s" x))
(define json-str (jsexpr->string jsx))
(read (open-input-string (read-json (open-input-string json-str))))


If you want a more detailed mapping, you'd want something like this that 
descends through the X-expression and encodes incompatible datatypes (like 
symbols) as JS-expression approximations. (The below example is illustrative, 
not exhaustive — it doesn't handle everything that coule appear in an 
X-expression)

#lang racket
(require txexpr json)
(define x '(root (p ((foo "bar")) "Hello world" 42) (p "Goodbye")))

(define/contract (xexpr->jsexpr x)
  (xexpr? . -> . jsexpr?)
  (cond
    [(txexpr? x) (list* (hasheq 'tag (symbol->string (get-tag x)))
                        (attrs->hash (get-attrs x))
                        (map xexpr->jsexpr (get-elements x)))]
    [else x]))

(define jsx (xexpr->jsexpr x))

(define/contract (jsexpr->xexpr x)
  (jsexpr? . -> . xexpr?)
  (cond
    [(and (pair? x) (hash? (car x)) (hash-has-key? (car x) 'tag))
     (apply txexpr* (string->symbol (hash-ref (car x) 'tag)) (map jsexpr->xexpr 
(cdr x)))]
    [(hash? x) (hash->attrs x)]
    [else x]))

(define x2 (jsexpr->xexpr jsx))

(equal? x x2)

-- 
You received this message because you are subscribed to the Google Groups 
"Pollen" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pollenpub+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to