RosettaCodeData/Task/S-expressions/PicoLisp/s-expressions-2.l

27 lines
577 B
Plaintext

(de readSexpr ()
(case (skip)
("(" (char) (readList))
("\"" (char) (readString))
(T (readAtom)) ) ) )
(de readList ()
(make
(loop
(NIL (skip))
(T (= @ ")") (char))
(link (readSexpr)) ) ) )
(de readString ()
(pack
(make
(until (= "\"" (or (peek) (quit "Unterminated string")))
(link (char)) )
(char) ) ) )
(de readAtom ()
(let X
(make
(until (or (sp? (peek)) (member (peek) '("(" ")")))
(link (char)) ) )
(or (format X) (intern (pack X))) ) )