Thank you. Though I'm not sure on my code is in good style, I managed to convert my
code to chicken scheme like this;
(set-read-syntax!
#\[
(lambda (port)
(let loop ((c (peek-char port)) (exps '()))
(cond ((eof-object? c)
(error "EOF encountered while parsing [ ... ] clause"))
((char=? c #\])
(read-char port) ; discard
`(vector ,@(reverse exps)))
((char-whitespace? c)
(read-char port) ; discard whitespaces
(loop (peek-char port) exps))
(else
(let ((exp (read port)))
(loop (peek-char port)
(cons exp exps))))))))
(print (with-input-from-string "[1 2 3 4 5]" read))
(set-read-syntax!
#\{
(lambda (port)
(let loop ((c (peek-char port)) (exps '()))
(cond ((eof-object? c)
(error "EOF encountered while parsing [ ... ] clause"))
((char=? c #\})
(read-char port) ; discard
`(alist->hash-table (chop (list ,@(reverse exps)) 2)))
((char-whitespace? c)
(read-char port) ; discard whitespaces
(loop (peek-char port) exps))
((char=? c #\,)
(read-char port) ; discard whitespaces
(loop (peek-char port) exps))
(else
(let ((exp (read port)))
(loop (peek-char port)
(cons exp exps))))))))
(print (with-input-from-string "{'a 10, 'b 20, 'c 30}" read))
(print (with-input-from-string "{'a 10 'b 20 'c 30}" read))
I post these code for people with similar needs like myself :-).