(use-modules (ice-9 match)) (use-modules (ice-9 vlist)) (use-modules (srfi srfi-1)) (eval-when (expand load eval) (define (read-hash-table-2 datum) (let ((insertions (map (match-lambda ((key value) `(hash-set! table ,key ,value))) datum))) (append `(let ((table (make-hash-table ,(length insertions))))) insertions '(table)))) (define (read-vhash-table datum) (let ((datum (reverse datum))) (fold (lambda (el acc) (match el ((key value) `(vhash-consq ,key ,value ,acc)) )) 'vlist-null datum))) (define (read-vlist datum) (list 'list->vlist (cons 'list datum))) (read-hash-extend #\h (lambda (chr port) (read-hash-table-2 (read port)))) (read-hash-extend #\v (lambda (chr port) (let ((type (read port)) (definition (read port))) (cond ((eq? 'h type) (read-vhash-table definition)) ((eq? 'l type) (read-vlist definition)) (else (error "woah I don't know this syntax"))))))) (define characters #h(('you "hooman") ('me "schemer"))) (display "I am a ") (display (hash-ref characters 'me)) ;; => schemer (newline) (define demo-table #h( ('name "Demo name") ('version "3.45.5") ('dependencies #h( ('hash-map-syntax "0.0.1"))) ((string-append "computed-" "key") #t))) (display (hash-ref demo-table "computed-key")) ;; => #t (newline) (define demo-vhash #vh( ('vh "vhash") ('vl "vlist"))) (define demo-vlist #vl( "Nice" "Syntax" #vl( "For" (string-append "Efficient" " " "structures"))))