; trailing comments
(define (tc? str) ; true when a trailing comment is found, else false
(let loop ((xs (string->list str)) (inquotes #f)) ; initialize loop
(cond ((null? xs) #f) ; reached end-of-line without comment
((and inquotes (char=? (car xs) #\")) ; end of quote
(loop (cdr xs) #f)) ; initialize for next quoted string
((and inquotes (char=? (car xs) #\\) (pair? (cdr xs))) ; escape
(loop (cddr xs) #t)) ; skip backslash and escaped character
(inquotes (loop (cdr xs) #t)) ; continue quote
((char=? (car xs) #\") (loop (cdr xs) #t)) ; start quote
((char=? (car xs) #\#) #t) ; found trailing comment
(else (loop (cdr xs) #f))))) ; next character
(display (tc? "x = \"# This is fine\"")) (newline)
(display (tc? "\"This \\# is fine too\"")) (newline)
(display (tc? "x = \"\" # This is not\"")) (newline)
OyB0cmFpbGluZyBjb21tZW50cwoKKGRlZmluZSAodGM/IHN0cikgICAgIDsgdHJ1ZSB3aGVuIGEgdHJhaWxpbmcgY29tbWVudCBpcyBmb3VuZCwgZWxzZSBmYWxzZQogIChsZXQgbG9vcCAoKHhzIChzdHJpbmctPmxpc3Qgc3RyKSkgKGlucXVvdGVzICNmKSkgICAgIDsgaW5pdGlhbGl6ZSBsb29wCiAgICAoY29uZCAoKG51bGw/IHhzKSAjZikgICAgICAgICAgIDsgcmVhY2hlZCBlbmQtb2YtbGluZSB3aXRob3V0IGNvbW1lbnQKICAgICAgICAgICgoYW5kIGlucXVvdGVzIChjaGFyPT8gKGNhciB4cykgI1wiKSkgICAgICAgICAgICA7IGVuZCBvZiBxdW90ZQogICAgICAgICAgICAobG9vcCAoY2RyIHhzKSAjZikpICAgICAgIDsgaW5pdGlhbGl6ZSBmb3IgbmV4dCBxdW90ZWQgc3RyaW5nCiAgICAgICAgICAoKGFuZCBpbnF1b3RlcyAoY2hhcj0/IChjYXIgeHMpICNcXCkgKHBhaXI/IChjZHIgeHMpKSkgOyBlc2NhcGUKICAgICAgICAgICAgKGxvb3AgKGNkZHIgeHMpICN0KSkgICA7IHNraXAgYmFja3NsYXNoIGFuZCBlc2NhcGVkIGNoYXJhY3RlcgogICAgICAgICAgKGlucXVvdGVzIChsb29wIChjZHIgeHMpICN0KSkgICAgICAgICAgICAgICAgICA7IGNvbnRpbnVlIHF1b3RlCiAgICAgICAgICAoKGNoYXI9PyAoY2FyIHhzKSAjXCIpIChsb29wIChjZHIgeHMpICN0KSkgICAgICAgIDsgc3RhcnQgcXVvdGUKICAgICAgICAgICgoY2hhcj0/IChjYXIgeHMpICNcIykgI3QpICAgICAgICAgICAgIDsgZm91bmQgdHJhaWxpbmcgY29tbWVudAogICAgICAgICAgKGVsc2UgKGxvb3AgKGNkciB4cykgI2YpKSkpKSAgICAgICAgICAgICAgICAgICA7IG5leHQgY2hhcmFjdGVyCgooZGlzcGxheSAodGM/ICJ4ID0gXCIjIFRoaXMgaXMgZmluZVwiIikpICAgKG5ld2xpbmUpCihkaXNwbGF5ICh0Yz8gIlwiVGhpcyBcXCMgaXMgZmluZSB0b29cIiIpKSAobmV3bGluZSkKKGRpc3BsYXkgKHRjPyAieCA9IFwiXCIgIyBUaGlzIGlzIG5vdFwiIikpIChuZXdsaW5lKQ==