; camel case
(define (camel-case->underscore str)
(let loop ((cs (string->list str)) (zs (list)))
(if (null? cs) (list->string (reverse zs))
(if (char-upper-case? (car cs))
(loop (cdr cs) (cons (char-downcase (car cs)) (cons #\_ zs)))
(loop (cdr cs) (cons (car cs) zs))))))
(define (underscore->camel-case str)
(let loop ((cs (string->list str)) (zs (list)))
(if (null? cs) (list->string (reverse zs))
(if (char=? (car cs) #\_)
(if (null? (cdr cs)) (list->string (reverse zs))
(loop (cddr cs) (cons (char-upcase (cadr cs)) zs)))
(loop (cdr cs) (cons (car cs) zs))))))
(display (camel-case->underscore "camelCaseToUnderscore")) (newline)
(display (underscore->camel-case "underscore_to_camel_case")) (newline)
OyBjYW1lbCBjYXNlCgooZGVmaW5lIChjYW1lbC1jYXNlLT51bmRlcnNjb3JlIHN0cikKICAobGV0IGxvb3AgKChjcyAoc3RyaW5nLT5saXN0IHN0cikpICh6cyAobGlzdCkpKQogICAgKGlmIChudWxsPyBjcykgKGxpc3QtPnN0cmluZyAocmV2ZXJzZSB6cykpCiAgICAgIChpZiAoY2hhci11cHBlci1jYXNlPyAoY2FyIGNzKSkKICAgICAgICAgIChsb29wIChjZHIgY3MpIChjb25zIChjaGFyLWRvd25jYXNlIChjYXIgY3MpKSAoY29ucyAjXF8genMpKSkKICAgICAgICAgIChsb29wIChjZHIgY3MpIChjb25zIChjYXIgY3MpIHpzKSkpKSkpCgooZGVmaW5lICh1bmRlcnNjb3JlLT5jYW1lbC1jYXNlIHN0cikKICAobGV0IGxvb3AgKChjcyAoc3RyaW5nLT5saXN0IHN0cikpICh6cyAobGlzdCkpKQogICAgKGlmIChudWxsPyBjcykgKGxpc3QtPnN0cmluZyAocmV2ZXJzZSB6cykpCiAgICAgIChpZiAoY2hhcj0/IChjYXIgY3MpICNcXykKICAgICAgICAgIChpZiAobnVsbD8gKGNkciBjcykpIChsaXN0LT5zdHJpbmcgKHJldmVyc2UgenMpKQogICAgICAgICAgICAobG9vcCAoY2RkciBjcykgKGNvbnMgKGNoYXItdXBjYXNlIChjYWRyIGNzKSkgenMpKSkKICAgICAgICAgIChsb29wIChjZHIgY3MpIChjb25zIChjYXIgY3MpIHpzKSkpKSkpCgooZGlzcGxheSAoY2FtZWwtY2FzZS0+dW5kZXJzY29yZSAiY2FtZWxDYXNlVG9VbmRlcnNjb3JlIikpIChuZXdsaW5lKQooZGlzcGxheSAodW5kZXJzY29yZS0+Y2FtZWwtY2FzZSAidW5kZXJzY29yZV90b19jYW1lbF9jYXNlIikpIChuZXdsaW5lKQ==